當前位置:首頁 » 編程語言 » 動態plsql
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

動態plsql

發布時間: 2022-06-24 15:34:06

❶ plsql如何動態的使用變數

加&<name>

引號內同樣管用,字元類型

'&<name>' 或者 輸入的時候 加''

❷ plsql中怎樣獲取未知結構的動態游標(ref

如果給的是一個查詢SQL文本,那麼事情很容易(對於9i及以上版本),只要使用dbms_sql.open_cursor打開游標,再使用dbms_sql.describe_columns即可得到游標的所有欄位名稱及類型等數據,存儲在一個集合類型變數中(具體請看dbms_sql.desc_tab)。請參考如下PLSQL代碼:
DECLARE
l_curidINTEGER; l_cntNUMBER;
l_desctabdbms_sql.desc_tab; l_sqltextVARCHAR2(2000); BEGIN
l_sqltext := 'select owner,object_type,object_name from dba_objects
where rownum<= 10';--可以是任意有效的查詢sql文本 l_curid := dbms_sql.open_cursor();
dbms_sql.parse(l_curid, l_sqltext, dbms_sql.native); dbms_sql.describe_columns(l_curid, l_cnt, l_descTab);
FOR i IN1 ..l_desctab.count LOOP
dbms_output.put(lpad(l_desctab(i).col_name, 20)); ENDLOOP;
dbms_output.new_line;
dbms_sql.close_cursor(l_curId); END;
運行結果如下:
OWNER OBJECT_TYPE OBJECT_NAME
注意,必須使用 DBMS_SQL.OPEN_CURSOR 打開游標,否則,就不是這種處理方法了。

❸ 動態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

----------------------------------------------

❹ plsql中怎麼寫動態的語句

設置一個變數 然後把拼接後的字元串賦值給他。
最後用 execute immediate 變數名 就可以了

❺ plsql如何將動態sql的查詢結果傳給游標

方法一,游標其實就是一條查詢語句,直接換成COUNT(1)就可以了
方法二,直接遍歷游標,就知道了
方法三:好像還有把結果集直接整到一個集合中,然後用集合的API,也一下統計出來了
BULK COLLECT INTO什麼的

❻ PLSQL 獲得動態游標 欄位名(列名)

oracle動態游標問題: 游標查詢的內容是 動態生成的,然後裡面具體有多少個欄位沒辦法事先知道,而動態游標賦值一定要用fetch到一個變數,有沒辦法把動態游標內容賦值到一個記錄集或者表中,而這個表的欄位和記錄集欄位是沒辦法預先定義好的,而是通過系統動態生成的!
具體例子如下:declare-- Local variables here
v_sql VARCHAR2(1024);
cur SYS_REFCURSOR;
v_column VARCHAR2(1024);
v_exe VARCHAR2(1024);begin---v_sql 是通過一連串的復雜邏輯程序生成的動態內容的 在這里就簡單寫了
v_sql:='select C_001,b_002,d_003 ..../*具體有多少個欄位沒辦法事先知道*/from table1,table2 .../*具體有多少個欄位沒辦法事先知道*/tablen where 1=1 and /*復雜條件*/';
v_column:= 'C_001+b_002/d_003';--這個變數也是通過復雜的邏輯生成的 沒辦法事先知道的 但是這里的欄位都在 v_sql 中有
v_column := replace(replace(REPLACE(v_column,'b_','c.b_'),'c_','c.c_'),,'c_','c.d_');
FOR i IN 1..e_table(i);
v_exe:='INSERT INTO table_a SELECT'|| v_column||' FROM al' ; /*這里的動態生成的*/!

❼ 什麼時候用plsql動態語句

在某些特殊的情況下,在PL/SQL中使用標準的SQL語句或DML語句不能實現自己的需求,比如需要動態建表或某個不確定的操作需要動態執行。這就需要使用動態SQL來實現
一般的PL/SQL程序設計中,在DML和事務控制的語句中可以直接使用SQL,但是DDL語句及系統控制語句卻不能在PL/SQL中直接使用,要想實現在PL/SQL中使用DDL語句及系統控制語句,可以通過使用動態SQL來實現。

❽ 怎麼在plsql中實現參數「個數」動態

executeimmediate'select*fromtestwheretest.idin(:1)'using'1,2,3,4,5';