当前位置:首页 » 编程语言 » oracle动态sqlusing
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

oracle动态sqlusing

发布时间: 2023-04-19 15:36:07

㈠ 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