當前位置:首頁 » 編程語言 » 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