㈠ 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