当前位置: 代码迷 >> PB >> 动态sql什么情况上使用,如何判断是否在编译时已知!
  详细解决方案

动态sql什么情况上使用,如何判断是否在编译时已知!

热度:92   发布时间:2016-04-29 08:10:44.0
动态sql什么情况下使用,怎么判断是否在编译时已知!!!??
查看动态sql的有关书籍中提到,动态sql能够处理动态生成的sql,什么是动态生成的sql》》》??

动态sql有四种类型:
  既无输入参数、也无结果集
  有输入参数、但没有结果集
  编译时已经知道参数和结果集的列
  开发程序时尚不知道参数和结果集

其中提到的输入参数是什么》??

第三类动态SQL的例子,得到籍贯是‘北京’的雇员:
 
C# code
    declare my_cursor dynaminc cursor for SQLSA;   int Emp_id_var   String Emp_state_var = 'MA'   String Sqlstatement   Sqlstatement = 'select emp_id from employee where emp_state= ?'   prepare sqlsa from :Sqlstatement;   open dynamic my_cursor using :Emp_state_var;   fetch my_cursor into :Emp_id_var;   close my_cursor;   


  上面例子用游标这样写可以吗???为什么》??
 
C# code
    string Emp_state_var = 'MA'   int Emp_id_var   declare my_cursor cursor for   select emp_id from employee where emp_state = :Emp_state_var;   open my_cursor;   fetch my_cursor into :Emp_id_var;   close my_cursor;   


------解决方案--------------------
declare my_cursor dynamic cursor for SQLSA;
int Emp_id_var
String Emp_state_var = 'MA'
String Sqlstatement

Sqlstatement = 'select emp_id from employee where emp_state= ?'
prepare sqlsa from :Sqlstatement;
open dynamic my_cursor using :Emp_state_var;
fetch my_cursor into :Emp_id_var;
close my_cursor;
------解决方案--------------------
以上在pb中可以编译通过,没有进行结果,你可以试一下,能否达到你的预期
------解决方案--------------------
区别于动态SQL,非动态SQL要访问的表与列都是固定的
------解决方案--------------------
PB中使用动态SQL语句
我们经常使用的SQL语句大多都是静态的,也就是说,SQL语句的结构是固定的,当编译Script时,整个SQL语句都是已知的,它们不能在运行时动态的改变。但是,在很多情况下,SQL语句或SQL所带的参数在编译时并不知道,应用必须在运行时才能生成SQL语句。这种在运行时才能生成的SQL语句叫动态SQL语句。动态SQL允许应用程序向数据库发送任何查询。此外,某些类型的操作,尤其是数据定义语言(DDL)的语句如CREATE和 DROP等,对嵌入式SQL根本就不可能。动态SQL使得可以象发送查询一样向数据库发送DDL和数据存取语言(Date Access Language)的语句。 
为了支持动态SQL,PowerBuilder提供了两种数据类型:DynamicStagingArea 和DynamicDescriptionArea。Powerbuilder使用DynamicStagingArea类型的变量为后续语句保存信息,用作语句的运行和事物对象之间的连接。DynamicStagingArea类型的变量是PowerBuilder内部使用的,用户无法访问DynamicStagingArea中的信息。PowerBuilder提供了一个全局的DynamicStagingArea变量,变量名为SQLSA,当需要一个DynamicStagingArea变量时可以使用它。用户也可以根据需要定义并创建另外的DynamicStagingArea类型的变量。下面的例子定义并创建了一个DynamicStagingArea类型的变量,变量名是Dsa_Stage1 
DynamicStagingArea Dsa_Stage1 
Dsa_Stage1=CREATE DynamicStagingArea 
PowerBuilder使用DynamicDescriptionArea类型的变量保存动态SQL语句中的输入和输出参数的信息。PowerBuilder也提供了一个全局的DynamicDescriptionArea变量,变量名为SQLDA,当需要一个DynamicDescriptionArea变量时可以使用它。用户也可以根据需要定义并创建另外的DynamicDescriptionArea类型的变量。下面的例子定义并创建了一个DynamicDescriptionArea类型的变量,变量名是Dda_Desc1。 
DynamicDescriptionArea Dda_Desc1 
Dda_Desc1=CREATE DynamicDescriptionArea 
为适应所有的SQL语句,PowerBuilder根据语句的类型和未知数的个数把动态SQL分为四种不同的格式。下面将详细介绍动态SQL的这四种格式。 
二、动态SQL格式一 
使用这种格式执行的SQL语句不会产生结果集,并且不需要输入参数。可以使用这种格式执行所有的数据定义语言(DDL)。语法如下: 
EXECUTE IMMEDIATE SQLStatement { USING TransactionObject } 
其中,SQLStatement是包括合法SQL语句的字符串,该字符串必须放在一行上,并且不能包含表达式。它可以是字符串常量或前面带有冒号的PowerBuilder字符串变量。TransactionObject是指向数据库的事物对象名。此方法成立的前提是:1、用于除SELECT之外的SQL语句。2、在SQL语句中不能包含变量。 
例如,下面语句创建一个名为 auths的表,它用串ls_sql存放SQL语句。 
String ls_sql 
//若与SQL SERVER、Sybase 11、ODBC数据库相连,在运行CREATE前, 
//必须置系统对象属性AUTOCOMMIT为TRUE 
SQLCA.AUTOCOMMIT=TRUE 
ls_sql="CREATE TABLE auths(auths_id char(6) NOT NULL,"+& 
"auths_name char(10) NOT NULL,auths_phone char(12),"+& 
"auths_address char(50),PRIMARY KEY(auths_id))" 
  相关解决方案