oracle動態sql以及繫結變數

2021-04-20 11:36:28 字數 1040 閱讀 4125

實現動態sql有兩種方式:dbms_sql和本地動態sql(execute immeidate) 。

oracle從8代開始就提供了新的執行動態sql的功能:execute immeidate v_sql using *** into ***;

本地動態sql

execute immediate 『語句』

[into ]

[using [in | out | in out] 繫結變數1, … 繫結變數n]

[ into 輸出1 [, …, 輸出n]…];

注意本地動態sql僅支援弱型別ref cursor,即對於ref cursor,不支援bulk collect.

動態sql的使用:1、執行dml語句,在pl/sql中不能直接執行dml語句;2、執行的語句是在程式執行前不可估計的,就比如在執行時該sql才會被按照不同的條件進行拼接等。

該方法引用動態sql的最大缺憾就是返回的結果集最多只能有一行,即使是ref cursor也只能包含一行的結果集。但是可以使用臨時表的方法,把結果集儲存起來,動態sql執行完畢後再取資料就可以了。也就是說,這個動態sql可以是乙個塊,裡面的語句可以足夠複雜,只要寫作者認為自己有能力除錯。

說到除錯,也是動態sql的乙個很大的缺憾吧,在pl/sql中,乙個varchar2的長度超過一定的大小後就自動轉化為 long value,無法列印,無法檢視,至少對於目前的我的能力,還沒有找到方法,即使使用substr的方法來分解串再列印的方法都會失敗。

繫結變數:動態sql的形成一般使用的拼串和榜定變數兩種方法,而普遍認為繫結變數有利於提高效率,其效率甚至與拼串的方式不可同日而語,這是可以理解的,繫結變數的使用,可以在多次執行sql時只使用一次語句分析、優化,而拼接則被認為是每次執行的sql都是不同的,每次執行都需要重新分析、優化,這往往是sql執行中最費時的操作。

動態sql高深莫測,如同指標一樣,但為什麼要使用那麼晦澀的語法呢,除非不得已。

本文**

oracle 動態sql 繫結變數

無繫結變數的非sql查詢 declare v sql varchar2 4000 begin 使用execute immediate執行動態sql,最後提交事物 v sql create table account id number 3 not null,name varchar2 50 not ...

oracle動態SQL繫結集合變數

有如下需求,在儲存過程中,傳遞的引數是字串,字串格式是 1,2,3 由數字組成,中間用 號分割 然後在sql語句如下使用 create or replace procedure movetoright v ids varchar2,v workid int asi sql varchar2 1000...

SQL Server動態SQL與變數繫結

有時候動態sql需要進行變數的賦值,這個時候就需要呼叫系統的儲存過程sp executesql了。使用中還是有些注意事項,如下 字元型字段需宣告為nvarchar型別 declare strsql nvarchar 1000 value str nvarchar 254 動態sql拼接 set st...