当前位置:文档之家› 动态SQL 并且把返回的值赋给变量

动态SQL 并且把返回的值赋给变量

动态SQL 并且把返回的值赋给变量
动态SQL 并且把返回的值赋给变量

动态SQL 并且把返回的值赋给变量

注意加粗部分,sp_executesql的参数必须为UNICODE,即

NCHAR,NVARCHAR,NTEXT型,否则报错

动态sql语句基本语法

1 :普通SQL语句可以用Exec执行

Select * from tableName

Exec('select * from tableName')

Exec sp_executesqlN'select * from tableName' -- 请注意字符串前一定要加N

2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

eg:

declare @fnamevarchar(20)

set @fname = 'FiledName'

Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。

Exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格

当然将字符串改成变量的形式也可

declare @fnamevarchar(20)

set @fname = 'FiledName' --设置字段名

declare @s varchar(1000)

set @s = 'select ' + @fname + ' from tableName'

Exec(@s) -- 成功

exec sp_executesql @s -- 此句会报错

declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) set @s = 'select ' + @fname + ' from tableName'

Exec(@s) -- 成功

exec sp_executesql @s -- 此句正确

3. 输出参数

declare @numint,

@sqlsnvarchar(4000)

set @sqls='select count(*) from tableName'

exec(@sqls)

--如何将exec执行结果放入变量中?

declare @numint,

@sqlsnvarchar(4000)

set @sqls='select @a=count(*) from tableName '

exec sp_executesql @sqls,N'@aint output',@num output select @num

如果是自己的存储过程中有参数,也可以不用sp_executesql,直接

CREATE PROCEDURE demo

@test varchar(100)

as

return 1

go

declare @name int

exec @name=demo 'test'

select @name

存储过程demo的参数中不能有函数

,如果要传递一个newid(),必须使用局部变量

注意存储过程的返回值必须为整形

declare @id

declare @name int

exec @name=demo @id

select @name

mssql帮助

执行可以多次重用或动态生成的Transact-SQL 语句或批处理。Transact-SQL 语句或批处理可以包含嵌入参数。

语法

sp_executesql [@stmt =] stmt

[

{, [@params =] N@#@parameter_namedata_type [,...n]@# } {, [@param1 =] @#value1@# [,...n] }

]

参数

[@stmt =] stmt

包含Transact-SQL 语句或批处理的Unicode 字符串,stmt必须是可以隐式转换为ntext的Unicode 常量或变量。不允许使用更复杂的Unicode 表达式(例如使用+ 运算符串联两个字符串)。不允许使用字符常量。如果指定常量,则必须使用N 作为前缀。例如,Unicode 常量N@#sp_who@# 是有效的,但是字符常量@#sp_who@# 则无效。字符串的大小仅受可用数据库服务器内存限制。

stmt可以包含与变量名形式相同的参数,例如:

N@#SELECT * FROM Employees WHERE EmployeeID =

@IDParameter@#

stmt中包含的每个参数在@params参数定义列表和参数值列表中均

必须有对应项。

[@params =] N@#@parameter_namedata_type [,...n]@#

字符串,其中包含已嵌入到stmt中的所有参数的定义。该字符串必须

是可以隐式转换为ntext的Unicode 常量或变量。每个参数定义均由

参数名和数据类型组成。n 是表明附加参数定义的占位符。stmt中指定的每个参数都必须在@params中定义。如果stmt中的Transact-SQL 语句或批处理不包含参数,则不需要@params。该参数的默认值为NULL。

[@param1 =] @#value1@#

参数字符串中定义的第一个参数的值。该值可以是常量或变量。必须为stmt中包含的每个参数提供参数值。如果stmt中包含的Transact-SQL 语句或批处理没有参数,则不需要值。

n

附加参数的值的占位符。这些值只能是常量或变量,而不能是更复杂的表达式,例如函数或使用运算符生成的表达式。

返回代码值

0(成功)或1(失败)

结果集

从生成SQL 字符串的所有SQL 语句返回结果集

例题:

[c-sharp]view plaincopy

1.declare @user varchar(1000)

2.declare @moTable varchar(20)

3.select @moTable = @#MT_10@#

4.declare @sql nvarchar(4000) --定义变量,注意类型

5.set @sql=@#select @user = count(distinct userid) from @#+@moTable --为变量

赋值

6.--执行@sql中的语句

7.exec sp_executesql @sql

8.,N@#@user varchar(1000) out@# --表示@sql中的语句包含了一个输出参数

9.,@user out --和调用存储过程差不多,指定输出参数值

10.print @user

C语言中变量和函数的声明与定义

变量 在将变量前,先解释一下声明和定义这两个概念。声明一个变量意味着向编译器描述变量的类型,但并不为变量分配存储空间。定义一个变量意味着在声明变量的同时还要为变量分配存储空间。在定义一个变量的同时还可以对变量进行初始化。 局部变量通常只定义不声明,而全局变量多在源文件中定义,在头文件中声明。 局部变量 在一个函数的内部定义的变量是内部变量,它只在本函数范围内有效。自动变量auto 函数中的局部变量,其缺省格式是自动变量类型。例如,在函数体中int b, c=3。和auto int b, c=3。是等价的。 自动变量是动态分配存储空间的,函数结束后就释放。自动变量如不赋初值,则它的值是一个不确定的值。 静态局部变量static 静态局部变量是指在函数体内声明和定义的局部变量,它仅供本函数使用,即其他函数不能调用它。静态局部变量的值在函数调用结束后不消失而保留原值,即其占用的存储单元不释放,在下一次函数调用时,该变量已有值,就是上一次函数调用结束时的值。 静态局部变量在静态存储区分配存储单元,在程序的整个运行期间都不释放。静态局部变量是在编译时赋初值的,即只赋初值一次。

在SDT编译器中,建议对静态局部变量赋初值,否则该静态局部变量的初值为不确定值。在其他编译器中,未初始化的静态局部变量的初值可能为零,这由具体的编译器所决定,使用前最好测试一下。 寄存器变量register 带register修饰符的变量暗示(仅仅是暗示而不是命令)编译程序本变量将被频繁使用,如果可能的话,应将其保留在CPU的寄存器中,以加快其存取速度。 对于现有的大多数编译程序,最好不要使用register修饰符。因为它是对早期低效的C编译程序的一个很有价值的补充。随着编译程序技术的进步,在决定哪些变量应当被存到寄存器中时,现在的C编译程序能比程序员做出更好的决定。 全局变量 在函数之外定义的变量称为外部变量,外部变量是全局变量,它可以为本文件中其他函数所共用。全局变量都是静态存储方式,都是在编译时分配内存,但是作用范围有所不同。 静态外部变量static 静态外部变量只能在本文件中使用。所以静态外部变量应该在当前源文件中声明和定义。 外部变量extern 定义函数中的全局变量时,其缺省格式是外部变量类型。外部变量应该在一个头文件中声明,在当前源文件中定义。外部变量允许其他文件引用。

变量的定义与声明

1.变量的定义 从前面的章节可以看出,程序中所有的东西几乎都有名字。然而字面量却是个例外,它没有名字。那么使用变量,我们就可以为某个值取名字了。实际上,我们是为系统内存中用于保存数据的某块空间取名字。 ANSI C规定:变量必须“先定义、后使用”,因此当用C定义变量时,不仅需要指定变量名,而且还必须告诉编译器其存储的数据类型,变量类型告诉编译器应该在内存中为变量名分配多大的存储单元,用来存放相应变量的值(变量值),而变量仅仅是存储单元的别名,供变量使用的最小存储单元是字节(Byte)。 由此可见,每个变量都占据一个特定的位置,每个存储单元的位置都由“地址”唯一确定并引用,就像一条街道上的房子由它们的门牌号码标识一样。即从变量中取值就是通过变量名找到相应的存储地址,然后读取该存储单元中的值,而写一个变量就是将变量的值存放到与之相应的存储地址中去。 由于变量的定义不是可执行代码,因此要求局部变量的定义必须位于用“{}包围的程序块”的开头,即在可执行代码的前面。比如: int lower_limit = 80; //定义lower_limit为整型变量 即在定义lower_limit为int类型数据时,系统就已经为变量lower_limit分配了存储单元。请注意区分变量名和变量值这两个不同的概念,其中,lower_limit为变量名,80为变量lower_limit的值,即存放在变量lower_limit的存储单元中的数据。 那么到底如何获得变量的地址呢?C语言使用“&(地址运算符)加变量名”的方式获取变量的地址,比如,&lower_limit就代表变量lower_limit的地址,详见后续相关章节的描述。 一个定义只能指定一种变量类型,虽然后面所带的变量表可以包含一个或多个该类型的变量: int lower_limit , upper_limit , sum; 但如果将一个定义语句中的多个变量拆开在多个定义语句中定义的话: int lower_limit; // lower_limit为数据下限 int upper_limit;// upper_limit为数据上限 int sum;// sum为求和的结果

动态SQL总结

关于动态SQL的一些总结 目的 动态SQL用于减小程序消耗并获取较高的执行性能,且容易编码,现越来越广泛的应用于数据库程序开发中。在SQL中,可以采用多种方式构造和执行动态SQL,比如EXECUTE IMMEDIATE、DBMS_SQL包等。由于ORACLE手册中并未覆盖这些功能,现简单说明下关于EXECUTE IMMEDIATE的用法。 名词定义 Oracle数据库开发PL/SQL块,常用SQL分为:静态SQL语句和动态SQL语句。 静态SQL,指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。 处理范围 ◆语句可变:允许用户在程序运行时,临时动态创建完整的语句 ◆条件可变:对于查询语句而言,语句的输出是确定的,但是查询子句(如WHERE 子句,GROUP BY子句,HAVING子句等)可变 ◆数据库对象等其他可变:对于别名,查询的表名、视图、过程名、DBLINK名等, 临时构建,均不确定。 语法 EXECUTE IMMEDIATEdynamic_string [INTO {define_variable [ , define_variable ] … |record}] [USING [IN | OUT | IN OUT ] bing_argument [, [IN | OUT | IN OUT ] bing_argument] … ]

[{RETURNING | RETURN} INTObind_argument [,bind_argument] … ] ◆dynamic_string用于指定存放SQL语句或PL/SQL块的字符串变量;define_variable 用于指定存放单行查询结果的变量;bind_argument用于存放传递的输入、输出变量。 ◆dynamic_string语句需用单引号括起来,需要使用特殊符号的地方需注意转义,如使 用引号时,用’’代替’;需要使用变量的地方,可以直接用:号加变量名,也可以用 || 连接符将直接调用变量。区别在于EXECUTE IMMEDIATE语句中,前者需要加USING传入变量,后者不用。 使用范例 1.一般执行语句: Begin EXECUTEIMMEDIATE'create table tab_test(test_code varchar2(200),test_value varchar2(20),remark varchar2(200))'; End; 2.带传入参数的动态语句(USING语句): 3.带传出参数的动态语句(INTO语句):

Oracle PLSQL变量的声明

Oracle PL/SQL变量的声明 可以使用下面两种语法声明PL/SQL变量: variable_name data_type [ [NOT NULL]:=default_value_expression]; variable_name data_type [ [NOT NULL] DEFAULT default_value_expression]; 变量名V ARIABLE_NAME可以是任何合法的PL/SQL标识符,合法的PL/SQL标识符必须满足如下条件: ●长度不能超过30个字符,而且中间不能有空格。 ●由字母、0到9的数字、下划线“_”、美元符号“$”以及符号“#”组成。 ●必须以字母开始。 ●不能使用PL/SQL或SQL中的关键字。例如,BEGIN、END不能作为变量名,因 为它在PL/SQL程序中有特殊的意义,表示块的开始和结束。 可以在SQL*Plus使用如下命令获得SQL和PL/SQL中的关键字: help reserved words 变量类型DATA_TYPE必须是合法的SQL或PL/SQL数据类型,变量的类型决定了其中存储的数据类型。如果变量只能存储一个单独的值,则该变量称为标量变量。如果变量中可以存储多个值(如表中一行记录),则该变量称为复合类型的变量。 标量变量所使用的数据类型包括字符、数字、日期和布尔类型等,标量变量所使用数据类型见表6-1所示。 表6-1 基本数据类型 类型说明 Boolean 布尔值,包括true、false和null Binary_integer -2,247483,648和2,247483,648之间的整数 Pls_integer 类似于binary_integer,但是计算速度更快 Number 数字型 Int 整数型 Pls_integer 整数型,产生溢出时出现错误 Binary_integer 整数型,表示带符号的整数 Char 定长字符型,最大255个字符 Varchar2 变长字符型,最大2000个字符 Date 日期型 Long 变长字符型,最长2GB NOT NULL表示变量必须是非空的,需要指定初始值。当变量被创建后,可以以值表达式的方式对其赋初始值。在声明变量时,还可以使用DEFAULT关键字指定变量的默认值,这样如果未向变量赋值时,变量的值就是设置的默认值。 下面介绍几种常用的数据类型,这些常用的数据类型包括NUMBER、V ARCHAR2、DA TE和BOOLEAN等。 V ARCHAR2是一种变长的数据类型。在PL/SQL中,该类型的最大长度为32767。使用V ARCHAR2类型变量的语法形式如下: char_variable varchar2(max_length); 其中,MAX_LENGTH参数是正整数,表示该变量最大可以容纳的字符数。

学习SQL应知道的动态SQL语句基本语法

精妙SQL详解 本文档由周公(周金桥)从网上搜集整理。版权归原作者所有。 欢迎访问本人博客:https://www.doczj.com/doc/ac15073186.html,/zhoufoxcn 2008-10-12 周公 目录 学习SQL应知道的动态SQL语句基本语法 (2) SQL Server数据库中经常用到的identity列 (3) “一网打尽”通用SQL数据库的查询语句(1) (3) 教你快速掌握一些异常精妙的"SQL"语句 (6) 实例讲解SQL Server中"Update"的用法 (7) 三种数据库利用SQL语句进行高效果分页 (8) 深入讲解SQL Server数据库的嵌套子查询 (9) 使用SQL视图查出所有的数据库字典 (10) 两个表间不存在的insert与存在的update (12) 实现跨多个表格的数据进行组合的SQL语句(1) (15) 深入讲解SQL Union和Union All的使用方法 (16) 巧用一条SQL 实现其它进制到十进制转换 (18) 实例讲解如何才能让你的SQL运行得更快(1) (19) 利用"SQL"语句自动生成序号的两种方式 (21) 详细讲解有关获取当月天数的实用技巧 (22) 为什么SQL不许在视图定义ORDER BY子句 (23) 一条SQL语句变得巨慢的原因及其解决方法 (23) 教你快速掌握SQL语句各种写法的效率问题 (24) 通过两个例子讲解PIVOT/UNPIVOT的用法 (25) 用一个实例讲解GROUP BY CEIL的使用方法 (27) 解析SQL语句中INSERT语句的另一种写法 (29) 轻松解决“每个Y的最新X”的SQL问题 (29) 教你快速掌握编写高效SQL语句的方法 (30) 个人经验总结:有关SQL语句的优化技术(1) (30) 用SQL语句删除重复记录的四种好方法 (32) 不要在SQL Server中盲目地追求一句处理(1) (35) 用人工智能技术自动对SQL语句进行重写(1) (38)

ORACLE关于动态SQL的使用

关于动态SQL的使用-----摘录 内容摘要:在PL/SQL开发过程中,使用SQL,PL/SQL可以实现大部份的需求,但是在某些特殊的情况下,在PL/SQL中使用标准的SQL语句或DML语句不能实现自己的需求,比如需要动态建表或某个不确定的操作需要动态执行。这就需要使用动态SQL来实现。本文通过几个实例来详细的讲解动态SQL的使用。 本文适宜读者范围:Oracle初级,中级 系统环境: OS:windows2000Professional(英文版) Oracle:8.1.7.1.0 正文: 一般的PL/SQL程序设计中,在DML和事务控制的语句中可以直接使用SQL,但是DDL语句及系统控制语句却不能在PL/SQL中直接使用,要想实现在PL/SQL中使用DDL语句及系统控制语句,可以通过使用动态SQL来实现。 首先我们应该了解什么是动态SQL,在Oracle数据库开发PL/SQL块中我们使用的SQL分为:静态SQL语句和动态SQL语句。所谓静态SQL指在PL/SQL块中使用的SQL语句在编译时是明确的,执行的是确定对象。而动态SQL是指在PL/SQL块编译时SQL语句是不确定的,如根据用户输入的参数的不同而执行不同的操作。编译程序对动态语句部分不进行处理,只是在程序运行时动态地创建语句、对语句进行语法分析并执行该语句。 Oracle中动态SQL可以通过本地动态SQL来执行,也可以通过DBMS_SQL包来执行。下面就这两种情况分别进行说明: 一、本地动态SQL 本地动态SQL是使用EXECUTE IMMEDIATE语句来实现的。 1、本地动态SQL执行DDL语句: 需求:根据用户输入的表名及字段名等参数动态建表。 create or replace procedure proc_test ( table_name in varchar2,--表名 field1in varchar2,--字段名 datatype1in varchar2,--字段类型 field2in varchar2,--字段名 datatype2in varchar2--字段类型 )as str_sql varchar2(500); begin str_sql:=create table||table_name||(||field1||||datatype1||,||field2|| ||datatype2||); execute immediate str_sql;--动态执行DDL语句 exception when others then null; end; 以上是编译通过的存储过程代码。下面执行存储过程动态建表。

变量声明、关键字和类型

模块三变量声明、关键字和类型 模块三变量声明、关键字和类型 (1) 1. 基本语法元素 (2) 1.1. 注释 (2) 1.2. 分号 (2) 1.3. 语句块(block) (3) 1.4. 空白 (4) 2. 标识符 (4) 3. Java关键字 (5) 4. 基本Java数据类型 (5) 4.1. 逻辑型──boolean (6) 4.2. 字符型──char (6) 4.3. 文本类──String (7) 4.4. 整数型──byte, short, int, long (7) 4.5. 浮点数──float和double (8) 5. 变量、声明和赋值 (8) 6. 引用(Reference)类型 (9) 6.1. 创建一个新类型 (9) 6.2. 创建并初始化一个对象 (10) 6.3. 存储器分配和布局 (10) 6.4. 引用类型的赋值 (11) 6.5. 值传递 (12) 6.6. this引用 (14) 7. Java编码约定 (15) 8. 练习:使用对象 (16) 8.1. 创建一个类和相应的对象 (16) 8.2. 检验引用赋值 (16) 9. 检查你的进度 (17)

本模块阐述了在Java技术中使用的基本元素,包括变量、关键字、原始类型和类类型。 完成本模块的学习后,你应该能够: -区分有效和无效标识符 -识别Java技术关键字 -列出八个原始类型 -为数字类型和文本类型定义文字值 -解释术语class、object、member variable和reference variable -为一个简单的包含原始成员变量的类创建一个类定义 -声明类类型变量 -使用new构造一个对象 -描述缺省初始化 -使用点符号访问一个对象的成员变量 -描述一个引用变量的意义 -描述分配类类型变量的结果 3.1 基本语法元素 3.1.1 注释 注释是程序员用来标记、说明程序的。编译器会忽略注释中的内容,注释中的内容不会对程序的运行产生任何影响。Java语言允许三种风格的注释: // 单行注释 /* 多行注释 */ /** 文档注释 */ 3.1.2 分号 在Java编程语言中,语句是一行由分号(;)终止的代码。 例如 totals=a+b+c+

MyBatis学习 之三动态SQL语句

MyBatis学习之三动态SQL语句 三、动态SQL语句 MyBatis学习之一、MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习之二、SQL语句映射文件(1)resultMap MyBatis学习之二、SQL语句映射文件(2)增删改查、参数、缓存 MyBatis学习之三、动态SQL语句 MyBatis学习之四、MyBatis配置文件 有些时候,sql语句where条件中,需要一些安全判断,例如按某一条件查询时如果传入的参数是空,此时查询出的结果很可能是空的,也许我们需要参数为空时,是查出全部的信息。使用Oracle的序列、mysql的函数生成Id。这时我们可以使用动态sql。 下文均采用mysql语法和函数(例如字符串链接函数CONCAT)。 3.1 selectKey 标签 在insert语句中,在Oracle经常使用序列、在MySQL中使用函数来自动生成插入表的主键,而且需要方法能返回这个生成主键。使用myBatis的selectKey标签可以实现这个效果。 下面例子,使用mysql数据库自定义函数nextval('student'),用来生成一个key,并把他设置到传入的实体类中的studentId属性上。所以在执行完此方法后,边可以通过这个实体类获取生成的key。 select nextval('student') INSERT INTO STUDENT_TBL(STUDENT_ID, STUDENT_NAME, STUDENT_SEX, STUDENT_BIRTHDAY, STUDENT_PHOTO, CLASS_ID, PLACE_ID) V ALUES (#{studentId}, #{studentName}, #{studentSex}, #{studentBirthday}, #{studentPhoto, javaType=byte[], jdbcType=BLOB, typeHandler=org.apache.ibatis.type.BlobTypeHandler}, #{classId}, #{placeId}) 调用接口方法,和获取自动生成key StudentEntity entity = new StudentEntity(); entity.setStudentName("黎明你好"); entity.setStudentSex(1); entity.setStudentBirthday(DateUtil.parse("1985-05-28")); entity.setClassId("20000001"); entity.setPlaceId("70000001"); this.dynamicSqlMapper.createStudentAutoKey(entity); System.out.println("新增学生ID: " + entity.getStudentId()); selectKey语句属性配置细节: 属性描述取值keyProper ty selectKey 语句生成结果需要设置的属性。 resultTyp e 生成结果类型,MyBatis 允许使用基本的数据类型,包括String 、int 类型。 order 1:BEFORE,会先选择主键,然后设置keyProperty,再执行insert 语句; 2:AFTER,就先运行insert 语句再运行selectKey 语句。 BEFORE AFTER

Oracle过程中执行动态SQL或DDL语句

如果你用的是Oracle8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句,但这个动态语句中带参数,或 Select 的结果要 into 到变量中时就要稍加留心一下了。而在 8i 以前的版本(谁还用这么古老的玩艺,总有些不得已的地方,老系统考虑升级成本遗留下来的,应用软件所伴随着的等),都没法用 execute immediate,就得使用 DBMS_SQL 包来实现了 何谓动态 SQL 和 DDL 语句呢?通常在过程中要操作的表名、字段名都必须是明确的,否则编译过程时就要报错,但如果这两者也用变量名来表示就是动态的。DDL 就是数据库对象定义的操作,如 CREATE TABLE/VIEW/INDEX/SYN/CLUSTER……,及这些对象的删除、修改操作等等。 比如在Oracle中有执行下面过程块的意图时,就要使用到 execute immediate 或是DBMS_SQL 包了。当然下面的语句块是通不过的。 declare col_name varchar2(30) := 'name'; --假定表user存在name字段 col_val varchar2(30); begin select col_name into col_val --按照惯常思维,可能就会这么写 from user where age between 18 and 25; --编译时会提示列名不存在的 drop table t2; --不能直接执行 DDL 语句,后面查询 t2 编译器就无能为力了 end; 现在我们提出对上面问题的解,针对第一个 Select 语句来说明,并假设查询中还带有参数。块中的 DDL 也是类似的解法。例子因力图涵盖更多内容,所以稍显复杂,如果不需要 into (如 update/delete 语句),或者不带参数,会简单多了,应不难简化。有两种处理方法,以 8i 为分水岭。 1. Oracle 8i 及以上版本的过程中处理动态 SQL 语句的办法 declare

变量的声明和定义之间的区别和联系

变量的声明和定义之间的区别和联系 前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”,从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。然而对于 extern a 来讲它只是声明不是定义。一般的情况下我们常常这样叙述,把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。很明显我们在这里指的声明是范围比较窄的,即狭义上的声明,也就是说非定义性质的声明,例如:在主函数中: int main() { extern int A; //这是个声明而不是定义,声明A是一个已经定义了的外部变量 //注意:声明外部变量时可以把变量类型去掉如:extern A; dosth(); //执行函数 } int A; //是定义,定义了A为整型的外部变量 外部变量的“定义”与外部变量的“声明”是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。对于外部变量来讲,初始化只能是在“定义”中进行,而不是在“声明”中。所谓的“声明”,其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是为了“提前”引用该变量而作的“声明”而已。extern 只作声明,不作任何定义。 (我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。)

在PB中动态修改SQL语句

在PB中动态修改SQL语句 数据库应用程序通常进行一项确定的工作,在编写和编译时就可以确定完整的SQL语句,但是在编译时不能确定SQL语句的具体格式和参数时,只能在程序运行过程中构造SQL语句,需要使用动态SQL语句。以Format 4 动态SQL语句为例,使用格式如下: DECLARE Cursor | Procedure DYNAMIC CURSOR | PROCEDURE FOR DynamicStagingArea ; PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ; DESCRIBE DynamicStagingArea INTO DynamicDescriptionArea ; OPEN DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea} ; EXECUTE DYNAMIC Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ; FETCH Cursor | Procedure USING DESCRIPTOR DynamicDescriptionArea ; CLOSE Cursor | Procedure ; ---- 在使用动态SQL语句时,需准备DynamicStagingArea对象(全局对象SQLSA)和DynamicDescriptionArea对象(全局对象SQLDA)。定义游标或过程,读取PREPARE语句中的SQL语句以及语句中说明的参数和类型,执行FETCH语句后,调用相关的函数逐条读取并处理检索结果。 ---- 动态SQL语句虽然解能够在程序运行过程中构造SQL语句,但在实际应用中较少使用。若SELECT语句的结果序列一定,可以通过重新指定DataWindow对象的SELECT语句的方法,达到动态修改SQL语句的功能。运用时首先用Describe函数读取DataWindow对象的SELECT 语句,用Replace等函数修改出符合要求的SELECT语句,并且可以增加检索条件,再用SetSQLSelect函数为DataWindow控件指定修改后的SELECT语句。 ---- 程序代码: string sql_string,sql_new long start_pos=1 string old_str //select语句中需要替换的字符串

变量声明和定义的区别

变量声明和定义的区别 我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1、一种是需要建立存储空间的。例如:int a 在声明的时候就已经建立了存储空间。 2、另一种是不需要建立存储空间的。例如:extern int a 其中变量a是在别的文件中定义的。 前者是“定义性声明(defining declaration)”或者称为“定义(definition)”,而后者是“引用性声明(referncing declaration)”,从广义的角度来讲声明中包含着定义,即定义是声明的一个特例,所以并非所有的声明都是定义,例如:int a 它既是声明,同时又是定义。然而对于extern a 来讲它只是声明不是定义。一般的情况下我们常常这样叙述,把建立空间的声明称之为“定义”,而把不需要建立存储空间的声明称之为“声明”。很明显我们在这里指的声明是范围比较窄的,即狭义上的声明,也就是说非定义性质的声明,例如:在主函数中: int main() { extern int A; //这是个声明而不是定义,声明A是一个已经定义了的外部变量 //注意:声明外部变量时可以把变量类型去掉如:extern A; dosth(); //执行函数 } int A; //是定义,定义了A为整型的外部变量 外部变量的“定义”与外部变量的“声明”是不相同的,外部变量的定义只能有一次,它的位置是在所有函数之外,而同一个文件中的外部变量声明可以是多次的,它可以在函数之内(哪个函数要用就在那个函数中声明)也可以在函数之外(在外部变量的定义点之前)。系统会根据外部变量的定义(而不是根据外部变量的声明)分配存储空间的。对于外部变量来讲,初始化只能是在“定义”中进行,而不是在“声明”中。所谓的“声明”,其作用,是声明该变量是一个已在后面定义过的外部变量,仅仅是为了“提前”引用该变量而作的“声明”而已。extern 只作声明,不作任何定义。 (我们声明的最终目的是为了提前使用,即在定义之前使用,如果不需要提前使用就没有单独声明的必要,变量是如此,函数也是如此,所以声明不会分配存储空间,只有定义时才会分配存储空间。) 用static来声明一个变量的作用有二: (1)对于局部变量用static声明,则是为该变量分配的空间在整个程序的执行期内都始终存在。 (2)外部变量用static来声明,则该变量的作用只限于本文件模块。

动态sql、静态sql、package

学了ORACLE的人,如果去理解DB2的动态和静态,简直要发狂. 在ORACLE中,select * from table where id=1, 这便是静态 下面便是动态: declare b varchar(100) b :='select * from table where id=:1' execute immediate b using 1 一看就知道,所谓的静态是一开始就知道SQL是什么,动态是开始不知道的,只有在执行的时候,execute immediate才知道原来where id=1. 但是在DB2,这种概念完全改变. select * from table where id=1 是什么态?好像是静态,其实在DB2中这是动态SQL. 如果上面这个SQL都是动态,那何为静态呢? 放开一点思维,在DB2中,所谓的动态,是指在执行的时候才编译. 比如你输入select * from table where id=1到cli中,SQL开始执行,自然就要编译。这便是DB2中的动态概念.和SQL 没有任何关系,只和编译有关系. 那么静态是什么,问到这个问题,自然有很多人会问什么是bind一个道理. 因为没有理解静态,所以无法理解BIND. 静态是指,SQL之前就编译好了. 已经生成了计划,这便引出了DB2 package的概念, package 便是存放了计划的东东. 总之package放了SQL执行一些必要条件. 这东西便是bind产生的. 搜索一下google就知道,解释DB2的静态和动态,大部分是这么说的,动态是执行的时候编译的,需要perpare, 静态是指预先编译,生成了package. DB2中有Package的概念,它是存储了你在相应的应用中使用的SQL语句的数据访问计划(Access Plan) 今天所做的程序最后封版,封版前觉得程序有一个地方让我很不爽,于是就进行了一下修改,改动其实很小,只是在if里面增加了一个判断条件,结果程序运行的时候开始报数据库系统错误,错误内容如下: [DB2/NT] SQL0805N 找不到程序包"NULLID.SYSLH203 0X5359534C564C3031"。SQL STATE=51002

变量声明表

在回答你的问题之前,有必要对变量声明表有一个基本了解。在STEP7中有两种用来定义符号地址的表格形式:符号表(共享符号)和变量声明表(局域符号),其本质都是为了建立绝对地址与符号地址之间的内在联系,但表格针对的对象不同。共享符号是整个程序所使用的共同符号(用于全局符号定义的表为符号表);而局域符号是某一特定逻辑快(OB、FB、FC等)所使用的临时性标记,只能在特定的逻辑块中进行临时性定义。用于临时性的、局域符号定义的表被称为变量声明表,又称局部变量声明表。 局部变量声明表分为参数(输入参数IN、输出参数OUT、输入/输出参数IN_OUT)和局部变量。局部变量又包括静态变量(STAT)和临时变量(TEMP)两种。参数可在调用块(逻辑块,块中的形参)和被调用块(功能FB有自己自动生成的背景数据块DI,而功能FC只能使用共享数据块,提供调用块的形参的实际参数值,与调用块形式参数一一对应,数据类型必需一致)。静态变量和临时变量是仅供逻辑块本身使用数据,不能用作不同程序块之间的数据接口。通过以上分析,我们知道所谓局部变量(包括静态变量和暂态变量)都是指对特定的逻辑块而言的,局部变量只是在它所在的块中有效,离开具体的逻辑块谈上述变量是没有意义的,你不能在其他块中调用利用变量(包括静态变量和暂态变量),这是与共享符号不一致的,共享符号可以被任意块

调用。在每个逻辑块的前上面部分就是变量声明表的区域,在变量声明表中,用户声明本块中专用的变量,即局部变量包括块的形参和参数的系统属性。你可以在不同的块中使用相同的局部变量符号不会产生冲突。 静态变量(STAT)在PLC运行期间始终被存储。S7 将静态变量定义在背景数据块(针对FB而言,FC和OB无静态变量),当被调用块运行时,能读出或修改静态变量;被调用块结束后,静态变量保留在数据块中; 临时变量(TEMP)是一种在块执行时,用来暂时存储数据的变量,这些数据存储在CPU工作存储区的局部数据堆栈(L 堆栈)中。临时变量可以在组织快OB、功能FC和功能块FB中使用,当块执行时它们被用来临时存储数据,一旦块执行介绍,堆栈重新分配,临时变量中的数据将丢失。 在程序块中,如果在块的变量声明表中有局部变量符号,编程是STEP7软化自动在局部变量名前加一个“#”号,如果要访问与局部变量重名的全局变量(在符号表中定义),则全局变量必须使用双引号(如“Symbol”)

PowerBuilder动态SQL语句及在组合查询中的应用.

PowerBuilder不仅支持在PowerScript中使用标准嵌入SQL语句,而且支持使用动态SQL语句。动态SQL语句可以解决嵌入SQL语句不支持DDL语句的问题,还能够在运行时构成SQL语句以解决在编译时不知道语句的具体格式或参数的问题。作者在“抚顺机动车辆管理信息系统”的开发过程中,对动态SQL语句的使用有了深刻的体会,车辆信息项目繁多而且组合条件复杂多变,使用该语句,不仅查询速度较高而且使用灵活可靠。下面就各动态SQL语句的使用格式、方法及各自的特点给予简单介绍,然后以查找车辆为例介绍动态SQL语句(格式4)在组合查询中的应用。 一、态SQL语句格式 PowerBuilder 有四种动态SQL格式,每种格式用于处理编译过程中的不同情况。 格式1:既没有输入参数,也没有输出结果集 格式2:有输入参数,但没有输出结果集 格式3:输入参数和结果集的列已知 格式4:输入参数和结果集在编译时有一个或都未知 1.动态SQL语句格式 格式 EXECUTE IMMEDIATE SQLStatement {USING TransactionObject} ; 参数描述 SQLStatement 是包括一条有效SQL语句的字符串。该字符串可以是常量或者冒号后面跟PowerBuilder变量(如:mysql)。该字符串必须只包括在一行上,且不能包含表达式。 TransactionObject(可选项)数据库的事务对象名 执行这种格式的SQL语句没有结果集、也不需要输入参数。这种格式可用来执行所有形式的数据定义语言(DDL)。 以下是一段建立车辆临时视图的例子: string sql sql=“CREATE VIEW temp_vehicle AS SELECT code , master FROM vehicle ” EXECUTE IMMEDIATE :sql USING SQLDA; 2. 动态SQL语句格式 格式 PREPARE DynamicStagingArea FROM SQLStatement {USING TransactionObject} ; EXECUTE DynamicStagingArea USING {ParameterList} ; 参数描述 DynamicStagingArea DynamicStagingArea变量名(通常为SQLSA) SQLStatement包含一条有效SQL语句的字符串。该字符串可以是常量或者冒号后面跟 PowerBuilder 变量(如:mysql)。在该语句中每个参数键入问号(?)。 TransactionObject(可选项)定义数据库的事务对象名 ParameterList (可选项)用冒号分隔的PowerScript变量列表以下是一段使用格式2的脚本: int id = 156 //车辆ID

0314变量的定义、使用

什么是变量 变量就是指在内存中开辟的储存空间,用于存放运算过程中需要用到的数据。 int a = 5; Int b = 6; Int c = a + b; <说明:变量a、b、c指代内存中三块用于存储整数的存储空间,分别用来存储两个整数以及这两个整数之和> 对于变量我们需要关注一下几个方面: -变量的声明:用特定的语法声明一个变量,让运行环境为其开辟空间; -变量的命名:变量需要有个见名知意的名字,而且要符合Java 的语言规范; -变量的初始化:变量声明后,要为其赋一个确定的初始值后再使用; -变量的访问:可以对变量中的数据进行存取、操作,但必须和其类型匹配。 一、变量的声明 当需要使用一个变量时,必须对该变量进行声明 变量的声明包含两点:变量名和变量类型 Int a ; -int:变量必须指明其类型 -a:必须指明变量名称 变量声明后,JVM会为该变量在内存中开辟存储空间,不同的变量类型决定了存储空间的结构。 二、未经声明的变量不能使用 -Java语言语法规定,变量在使用之前必须声明,否则会编译错误。 public static void main(String[] args){ a = 1;//编译错误,变量没有声明 Int score = 0; Scord = 100;//编译错误,拼写错误造成 System.out.println(score); } 三、一条语句中声明多个变量 -如果多个变量类型一样,可以在一条语句中声明,中间用逗号隔开。 public static void main(String[] args){ Int a = 1 ,b = 2;//声明了两个变量,分别赋值为1和2;

MyBatis动态Sql语句

MyBatis动态Sql语句 MyBatis中对数据库的操作,有时要带一些条件,因此动态SQL语句非常有必要,下面就主要来讲讲几个常用的动态SQL语句的语法 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach 1、if 对属性进行判断,如果不为空则执行判断条件 [html] view plain copy 来看看结果: 这是从web页面输入的参数 这是输出的结果 这是打印出来的Sql语句 从结果可以看出,只有在条件不为空的时候,属性才会赋值。 2、where 当where中的条件使用的if标签较多时,这样的组合可能会导致错误。我们以在1中的查

sql 动态语句

sql 动态语句 1 :普通SQL语句可以用Exec执行例: Select * from tableName Exec('select * from tableName') Exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N 2:字段名,表名,数据库名之类作为变量时,必须用动态SQL 错误: declare @fname varchar(20) set @fname = 'FiledName' Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。正确: Exec('select ' + @fname + ' from tableName') -- 请注意加号前后的单引号的边上加空格 当然将字符串改成变量的形式也可 declare @fname varchar(20) set @fname = 'FiledName' --设置字段名 declare @s varchar(1000) set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句会报错 --注:@s参数必须为ntext或nchar或nvarchar类型,必须将declare @svarchar(1000) 改为declare @s Nvarchar(1000) 如下: declare @s Nvarchar(1000) -- 注意此处改为nvarchar(1000) set @fname = 'FiledName' --设置字段名 set @s = 'select ' + @fname + ' from tableName' Exec(@s) -- 成功 exec sp_executesql @s -- 此句正确 3. 输入或输出参数 (1)输入参数: declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为ntext或nchar哐nvarchar 类型,不能是varchar类型) declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串(注:必须为ntext或nchar哐nvarchar类型,不能是varchar类型) declare @input_id int--定义需传入动态语句的参数的值 set @QueryString='select * from tablename where id=@id' --id为字段名,@id为要传入的参数set @paramstring='@id int' --设置动态语句中参数的定义的字符串 set @input_id =1 --设置需传入动态语句的参数的值为1 exec sp_executesql @querystring,@paramstring,@id=@input_id 若有多个参数: declare @QueryString nvarchar(1000) --动态查询语句变量(注:必须为 ntext或nchar哐nvarchar类型,不能是varchar类型) declare @paramstring nvarchar(200) --设置动态语句中的参数的字符串

相关主题
文本预览
相关文档 最新文档