㈠ Oracle存储过程USING OUT用法及用处
动态sql
using out v_erortx意思是insert into tab()......"这句中的变量用传出参锋此数v_erortx绑定,宽基游比慎销如动态SQL中有一个过程,而该过程的有个OUT 参数,此时就可以用USING OUT 的方式
Execute Immediate 'begin mypro1(:1,:2); end;'
Using In 1,Out v_erortx;
㈡ 动态SQL中的重复占位符如何与绑定变量进行
BEGIN calc_stats(:x, :x, :y, :x); END 是一个PL/SQL 代码段,而非 insert into t6 (a,b,c) values (:x,:y,:x) 这样的DML,标准SQL语句。
在EXECUTE IMMEDIATE 中,利用USING语句绑定变量时,Oracle遵循针对PL/SQL存储过程使用占位符名称匹配的原则,而针对SQL语句则采用占位符位置匹配的原则。
PL/SQL 用户指南与参考 中的 例子如下:
动态SQL语句中的占位符与USING子句中的绑定参数是位置关联的,而不是名称关联。所以,如果在SQL语句中同样的占位符出现两次或多次,那么,它的每次出现都必须与一个USING子句中的绑定参数相关联。例如下面的动态字符串:
sql_stmt := 'INSERT INTO payroll VALUES (:x, :x, :y, :x)';
我们可以为动态字符串编写对应的USING子句:
EXECUTE IMMEDIATE sql_stmt USING a, a, b, a;
但 是,动态PL/SQL块中只有唯一的占位符才与USING子句中的绑定参数按位置对应。所以,如果一个占位符在PL/SQL块中出现两次或多次,那么所有 这样相同的占位符都只与USING语句中的一个绑定参数相对应。比如下面的例子,第一个占位符(x)与第一个绑定参数(a)关联,第二个占位符(y)与第 二个绑定参数(b)关联。
DECLARE
a NUMBER := 4;
b NUMBER := 7;
BEGIN
plsql_block := 'BEGIN calc_stats(:x, :x, :y, :x); END';
EXECUTE IMMEDIATE plsql_block
USING a, b;
...
END;
---------------------------------------------------------------------------------------------
CREATE TABLE T1 (N1 NUMBER, N2 NUMBER,N3 NUMBER,N4 NUMBER);
BEGIN
EXECUTE IMMEDIATE 'INSERT INTO T1(N1,N2,N3,N4) VALUES (:N1,:N2,:N2,:N1)' USING 1,2;
END;
/
*
ERROR at line 1:
ORA-01008: not all variables bound
ORA-06512: at line 2
BEGIN
EXECUTE IMMEDIATE 'BEGIN INSERT INTO T1(N1,N2,N3,N4) VALUES (:N1,:N2,:N2,:N1); END;' USING 1,2;
END;
/
PL/SQL procere successfully completed.
SELECT * FROM T1;
N1 N2 N3 N4
---------- ---------- ---------- ----------
1 2 2 1
----------------------------------------------
㈢ 如何在oracle存储过程中执行动态sql语句
给你一个案例对这些,使用execute immediate就可以了,存储过程和语句块也是一样的,自己改一改,没区别的。
语法格式
EXECUTEIMMEDIATEdynamic_string
[INTO{define_variable[,define_variable]...|record}]
[USING[IN|OUT|INOUT]bind_argument[,[IN|OUT|INOUT]bind_argument]...]
[{RETURNING|RETURN}INTObind_argument[,bind_argument]...];
1,操作DDL语句,这也是动态SQL的常用操作之一
如下所示使用动态SQL创建数据库表:
DECLARE
l_dync_sqlVARCHAR2(100);
BEGIN
l_dync_sql:='CREATETABLEcux_dync_test(idNUMBER,creation_dateDATE)';
EXECUTEIMMEDIATEl_dync_sql;
END;
2,操作DML语句,使用USING子句可以按照顺序将输入的值绑定到变量,如果动态SQL只有单行输出的话可以直接使用INTO来接收输出值,如下所示。
DECLARE
l_dync_sqlVARCHAR2(100);
l_person_nameVARCHAR2(140);
l_ageNUMBER;
BEGIN
l_dync_sql:='SELECTperson_name,ageFROMcux_cursor_testWHEREperson_id=:1';
EXECUTEIMMEDIATEl_dync_sql
INTOl_person_name,l_age--使用into语句接手动态SQL的输出,如果输出多行则出错
USING101;--给绑定变量赋值
dbms_output.put_line('PersonName:'||l_person_name);
dbms_output.put_line('Age:'||l_age);
END;
㈣ oracle中的using怎么用啊
V_SQLSTR
:=
'INSERT
INTO
'
||
V_TABLENAME
||
'('
||
'
SELECT
DISTINCT
KBP,KPI_NO,DCTIME,:1
WRITETIME,TO_NUMBER(VALUE)
'
||
'
FROM
BIZMAN_PM_TEMP
)';
这是一个动态的SQL,即通侍洞局过EXECUTE
IMMEDIATE来执行一个字符串的SQL,而这里面老让通过冒号开头的是参数,EXECUTE
IMMEDIATE后边USING的顺序就是里面参数的顺序。您这里面对应的就是:1,即把V_CURRENTTIME的值代入到冒号1的位置,执行这个插入语句。
USING
OUT:如果动态SQL中有一个过程,而该过程的有个OUT
参数,此时就可以用USING
OUT
的方颤茄式
㈤ Oracle动态SQL返回单条结果和结果集
DDL 和 DML
前巧/*** DDL ***/
begin
EXECUTE IMMEDIATE drop table temp_ ;
EXECUTE IMMEDIATE create table temp_ (name varchar ( )) ;
end;
/*** DML ***/
declare
v_ varchar ( );
v_ varchar ( );
str varchar ( );
begin
v_ := 测试人员 ;
v_ := 北京 ;
str := INSERT INTO test (name address) VALUES (: : ) ;
EXECUTE IMMEDIATE str USING v_ v_ ;
mit;
end;
返回单条结果
declare
str varchar ( );
c_ varchar ( );
r_ test%rowtype;
begin
c_ := 测试人员 ;
str:= select * from test where name=:c WHERE ROWNUM= ;
execute immediate str into r_ using c_ ;
DBMS_OUTPUT PUT_LINE(R_ NAME||R_ ADDRESS);
end ;
返回结果集
CREATE OR REPLACE package pkg_test as
/* 定义ref cursor类型
不加return类型 为弱类型 允许动态sql查询
否则为强类型 无法使用动态sql查询;
*/
type myrctype is ref cursor;
函数申明
function get(intID number) return myrctype;
end pkg_test;
/
慧含键CREATE OR REPLACE package body pkg_test as
函数体
function get(intID number) return myrctype is
rc myrctype; 定义ref cursor变量
sqlstr varchar ( );
begin
if intID= then
静态测试 直接用select语句直接返回结果
open rc for select id name sex address postcode birthday from student;
else
动态sql赋值 用:w_id来申明该变量从外部获得
sqlstr := select id name sex address postcode birthday from student where id=:w_id ;
动态测试 用sqlstr字符串返回结果 用using关键词传递参数
老扮open rc for sqlstr using intid;
end if;
return rc;
end get;
end pkg_test;
lishixin/Article/program/Oracle/201311/17186
㈥ oracle中SQL动态传参数问题
open rc;
cursor param_value IS
名称不一致呢,下面的游标名称为rc,一开始者裤定义的游标名称首困简尺清是param_value
fetch rc
into v_column_name, v_table_name;
这样导致 v_column_name未能取到值,
所以sql_str 中的v_column_name 的值不能取到
㈦ oracle 中 merge into 在动态sql 中怎么用
merge into table1 t
using (select a,b,c from table2)a
on (t.a=a.a and t.b=a.b)
when matched then
update set t.c=a.c
纯手打 ,望采纳
㈧ Oracle 动态SQL中如何参数化表名
表名可用变量,但一般需要用到动态sql,举例如下:
declare
v_date varchar2(8);--定义日期变量
v_sql varchar2(2000);--定义动态sql
v_tablename varchar2(20);--定义动态表名
begin
select to_char(sysdate,'yyyymmdd') into v_date from al;--取日期变量
v_tablename := 'T_'||v_date;--为动态表命名
v_sql := 'create table '||v_tablename||'
(id int,
name varchar2(20))';--为动态sql赋值
dbms_output.put_line(v_sql);--打印sql语句
execute immediate v_sql;--执行动态sql
end;
执行以后,就会生成以日期命名的表。
㈨ oracle中动态sql中的using、into各是什么作用通俗地讲,别用书面语
using 指的是where条件中的变量
into 指的是要获取的数据变量
比如说
V_SQL_T := 'SELECT SUM(QTY), SUM(COST * QTY)
FROM SALES
WHERE SALE_DATE = :1';
EXECUTE IMMEDIATE V_SQL_T
INTO T_QTY, T_AMT
USING D_SALESDATE;
上面INTO就是要sum(qty)和sum(cost*qty)赋值到t_qty和t_amt两个变量,using就是把d_salesdate变量代入:1作为条件
㈩ oracle笔记-动态SQL
第 章 动态SQL
为何使用动态SQL
实现动态SQL有两种方式 DBMS_SQL和本地动态SQL(EXECUTE IMMEIDATE)
主要从以下方面考虑使用哪种方式
是否知道涉及的列数和类型
DBMS_SQL包括了一个可以 描述 结果集的存储过程(DBMS_SQL DESCRIBE_COLUMNS) 而本地动态SQL没有
是否知道可能涉及的绑定变量数和类型
DBMS_SQL允许过程化的绑定语句的输入 而本地动态SQL需要在编译时确定
是否使用 数组化 操作(Array Processing)
DBMS_SQL允许 而本地动态SQL基本不可以 但可以用其他方式实现(对查询可用FETCH BULK COLLECT INTO 对INSERT等 可用一个BEGIN … END块中加循环实现)
是否在同一个会话中多次执行同一语句
DBMS_SQL可以分析一次执行多次 而本地动态SQL会在每次执行时进行软分析
是否需要用REF CURSOR返回结果集
仅本地动态SQL可用REF CURSOR返回结果集
如何使用动态SQL
DBMS_SQL
调用OPEN_CURSOR获得一个游标句柄
调用PARSE分析语句 一个游标句柄可以用于多条不同的已分析语句 但一个时间点仅一条有效
调用BIND_VARIABLE或BIND_ARRAY来提供语句的任何输入
若是一个查询(SELECT语句) 调用DIFINE_COLUMN或DEFINE_ARRAY来告知Oracle如何返回结果
调用EXECUTE执行语句
若是一个查询 调用FETCH_ROWS来读取数据 可以使用COLUMN_VALUE从SELECT列表根据位置获得这些值
否则 若是一个PL/SQL块或带有RETURN子句的DML语句 可以调用VARIABLE_VALUE从块中根据变量名获得OUT值
调用CLOSE_CURSOR
注意这里对任何异常都应该处理 以关闭游标 防止泄露资源
本地动态SQL
EXECUTE IMMEDIATE 语句
[INTO {变量 变量 … 变量N | 记录体}]
[USING [IN | OUT | IN OUT] 绑定变量 … 绑定变量N]
[{RETURNING | RETURN} INTO 输出 [ … 输出N]…]
注意本地动态SQL仅支持弱类型REF CURSOR 即对于REF CURSOR 不支持BULK COLLECT
最后说明
lishixin/Article/program/Oracle/201311/18948