澳门金莎娱乐手机版 数据库 2. 动态生成cursor,而动态 SQL是指在 PL/SQL块编写翻译时

2. 动态生成cursor,而动态 SQL是指在 PL/SQL块编写翻译时

定义PROCEDUREP1( P_Asset_Type IN varchar2,P_Asset_SubType IN
varchar2,P_OrderIds IN varchar2)。

本地动态 SQL

内需依据传入参数动态查询,动态生成cursor可能动态实践SQL的DML操作。

第意气风发大家应有了然哪些是动态 SQL,在 Oracle数据库开辟 PL/SQL块中大家使用的
SQL

1.简易的询问

分为:静态 SQL语句和动态 SQL语句。所谓静态 SQL指在 PL/SQL块中选择的
SQL语句在编

SELECTABC from TableAwhere ORDER_ID IN ( P_OrderIds) ;

译时是刚强的,试行的是明确指标。而动态 SQL是指在 PL/SQL块编写翻译时
SQL语句是不鲜明

2. 动态生成cursor

的,如基于顾客输入的参数的比不上而实行区别的操作。编写翻译程序对动态语句部分不开展管理,

概念游标和变量:

只是在程序运维时动态地开创语句、对语句进行语法深入分析并实行该语句。

type v_cursor is ref cursor; C1 v_cursor; v_command varchar2(2000);

Oracle中动态 SQL能够通过本地动态 SQL来实施,也足以经过
DBMS_SQL包来实施。

v_command := ”SELECT ABC from TableA where ORDER_ID IN ( ”
||P_OrderIds|| ” ) ”;

上边就那二种状态分别开展求证:

OPEN C1 for v_command;

大器晚成、本地动态 SQL

3.动态DML操作

地方动态 SQL是运用 EXECUTE IMMEDIATE语句来促成的。

v_command2 := ”UPDATE TableA SET ASSET_TYPE_CD =
”””||P_Asset_Type||”””,” ||”ASSET_SUBTYPE_CD =
”””||P_Asset_SubType||”””” ||”WHERE ORDER_ID IN (
”||P_OrderIds||” ) ”;

1、本地动态 SQL实施 DDL语句:

execute immediate v_command2;

急需:遵照客商输入的表名及字段名等参数动态建表。

create or replace procedure proc_test

(

table_name in varchar2, –表名

field1 in varchar2, –字段名

datatype1 in varchar2, –字段类型

field2 in varchar2, –字段名

datatype2 in 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 ;

上述是编译通过的存款和储蓄过程代码。上面推行存款和储蓄进度动态建表。

SQL> execute proc_test(’dinya_test’,’id’,’number(8) not
null’,’name’,’

varchar2(100)’);

PL/SQL procedure successfully completed

SQL> desc dinya_test;

Name Type Nullable Default Comments


ID NUMBER(8)

NAME VARCHAR2(100) Y

 

SQL>

到那边,就兑现了大家的须要,使用本地动态 SQL依据客商输入的表名及字段名、

字段类型等参数来兑现动态实行 DDL语句。

2、本地动态 SQL实践 DML语句。

必要:将顾客输入的值插入到上例中建好的 dinya_test表中。

create or replace procedure proc_insert

(

id in number, –输入序号

name in varchar2 –输入人名

) as

str_sql varchar2(500);

begin

str_sql:=’insert into dinya_test values(:1,:2)’;

execute immediate str_sql using id,name; –动态实施插入操作

exception

when others then

null;

end ;

实行存款和储蓄进程,插入数据到测量检验表中。

SQL> execute proc_insert(1,’dinya’);

PL/SQL procedure successfully completed

SQL> select * from dinya_test;

ID NAME

1 dinya

在上例中,本地动态 SQL施行 DML语句时使用了 using子句,按顺序将输入的值绑

定到变量,即便急需输出参数,能够在进行动态 SQL的时候,使用 RETU索罗德NING
INTO 子句,

澳门金莎娱乐手机版 ,如:

declare

p_id number:=1;

v_count number;

begin

v_string:=’select count(*) from table_name a where a.id=:id’;

execute immediate v_string into v_count using p_id;

end ;

越来越多的关于动态 SQL中关于再次回到值及为出口输入绑定变量实施参数方式的难点,请

读者自行做测验。

 

二、使用 DBMS_SQL

使用 DBMS_SQL包完毕动态 SQL的步子如下:A、先将在试行的
SQL语句或一个言语

块放到叁个字符串变量中。B、使用 DBMS_SQL包的
parse进度来分析该字符串。C、使用

DBMS_SQL包的 bind_variable进程来绑定变量。D、使用 DBMS_SQL包的
execute函数来执

行语句。

1、使用 DBMS_SQL包执行 DDL语句

需求:使用 DBMS_SQL包依据顾客输入的表名、字段名及字段类型建表。

create or replace procedure proc_dbms_sql

(

table_name in varchar2, –表名

field_name1 in varchar2, –字段名

datatype1 in varchar2, –字段类型

field_name2 in varchar2, –字段名

datatype2 in varchar2 –字段类型

)as

v_cursor number; –定义光标

v_string varchar2(200卡塔尔国; –定义字符串变量

v_row number; –行数

begin

v_cursor:=dbms_sql.open_cursor; –为管理展开光标

v_string:= ’ create table ’ ||table_name|| ’ ( ’ ||field_name1|| ’ ’

||datatype1||’,’||field_name2||’ ’||datatype2||’)’;

dbms_sql.parse(v_cursor,v_string,dbms_sql.native卡塔尔; –剖判语句

v_row:=dbms_sql.execute(v_cursor卡塔尔(英语:State of Qatar); –试行语句

dbms_sql.close_cursor(v_cursor卡塔尔(قطر‎; –关闭光标

exception

when others then

dbms_sql.close_cursor(v_cursor卡塔尔国; –关闭光标

raise;

end;

以上进程编写翻译通过后,推行进程创造表布局:

SQL> execute proc_dbms_sql(’dinya_test2’,’id’,’number(8) not
null’,’

name’,’varchar2(100)’);

PL/SQL procedure successfully completed

SQL> desc dinya_test2;

Name Type Nullable Default Comments


ID NUMBER(8)

NAME VARCHAR2(100) Y

 

SQL>

2、使用 DBMS_SQL包执行 DML语句

需求:使用 DBMS_SQL包依照顾客输入的值更新表中相对应的记录。

查看表中原来就有记录:

SQL> select * from dinya_test2;

ID NAME

1 Oracle

2 CSDN

3 ERP

SQL>

建存款和储蓄进度,并编写翻译通过:

create or replace procedure proc_dbms_sql_update

(

id number,

name varchar2

)as

v_cursor number; –定义光标

v_string varchar2(200卡塔尔(قطر‎; –字符串变量

v_row number; –行数

begin

v_cursor:=dbms_sql.open_cursor; –为拍卖张开光标

v_string:=’update dinya_test2 a set a.name=:p_name where
a.id=:p_id’;

dbms_sql.parse(v_cursor,v_string,dbms_sql.native卡塔尔国; –深入分析语句

dbms_sql.bind_variable(v_cursor,’:p_name’,name卡塔尔; –绑定变量

dbms_sql.bind_variable(v_cursor,’:p_id’,id卡塔尔(قطر‎; –绑定变量

v_row:=dbms_sql.execute(v_cursor卡塔尔(英语:State of Qatar); –实施动态SQL

dbms_sql.close_cursor(v_cursor卡塔尔国; –关闭光标

exception

when others then

dbms_sql.close_cursor(v_cursor卡塔尔(قطر‎; –关闭光标

raise;

end;

实施进度,依照用户输入的参数更新表中的数量:

SQL> execute proc_dbms_sql_update(2,’csdn_dinya’);

PL/SQL procedure successfully completed

SQL> select * from dinya_test2;

ID NAME

 

1 Oracle

2 csdn_dinya

3 ERP

SQL>

执行进程后将第二条的 name字段的数额更新为新值
csdn_dinya。那样就完事了接纳

dbms_sql包来实践 DML语句的意义。

使用 DBMS_SQL中,如果要奉行的动态语句不是查询语句,使用
DBMS_SQL.Execute或

DBMS_SQL.Variable_Value来实践,即便要试行动态语句是查询语句,则要采取

DBMS_SQL.define_column定义输出变量,然后选择 DBMS_SQL.Execute,

DBMS_SQL.Fetch_Rows, DBMS_SQL.Column_Value及
DBMS_SQL.Variable_Value来施行查询

并获得结果。

标签:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图