1. 程式人生 > 實用技巧 >oracle_單引號問題和execute immediate 賦值問題

oracle_單引號問題和execute immediate 賦值問題

今天初步學習了oracle後,發現了一些關鍵的小技巧

從第一引號向後,如果遇到第二個引號,則看這個引號後面時候有緊挨著的引號,如果有則第二個引號被轉義,即該保留該引號後面緊跟的那個引號

declare
v_char varchar2(2) :='zz';
begin
execute immediate ' delete from aa where b='''||v_char||''' ';
end;

(1) 有關單引號的問題

在使用||進行字串或者變數的拼接時,常常會用到單引號。

單引號有兩個作用, 一個是用作單引號,一個是轉義。單引號普通的使用不必多說,重點在於轉義。

當你如果想對一個變數進行一些sql語句的操作時,往往會要使用 '+變數名+

’的形式

例如:select count(1) from sys.user_tables where table_name='tableName' //這裡的tableName是一個變數,假設它的值為emp

此時如果呼叫的話,那麼就會出現一些錯誤,因為此時的table_name='tableName',並不是我們想要的值,我們要的值為table_name='emp'

所以問題來了,如何實現

此時就用到單引號的轉義字元的功能

當單引號出現多個時,第二個單引號便是轉義字元。

例如:' select count(1) from sys.user_tables where table_name='||' '''||tableName||''' '

''''中,開頭和結尾的'作為字串的引用,中間兩個的第一個為轉義字元,中間兩個的第二個為單純的',所以,通過這種方式,我們就解決了剛剛的功能。

execute immediate' select count(1) from sys.user_tables where table_name='||' '''||tableName||''' '; 來執行

(2)execute immediate 賦值問題

select count(1)into v_aafrom emp where empno=1; //v_aa 是一個變數

通過這種方法對v_aa這個變數賦值時,如果採用execute immediate 執行這條語句進行賦值,此時是錯誤的。

應該是

execute immediate 'select count(1)from emp where empno=1' into v_aa ;

沒錯,如果使用execute immediate,賦值應該放在最後!

利用字元拼接方法,將遊標變數和DDL語言拼接成完整的DDL語言並存儲到變數中。

在塊中需要執行DDL語言時,就必須用以下這種方式,不能直接在塊中寫DDL語言

execute immediate 'DDL語言' ;

如果不需要引入變數,也可以直接將DDL語言寫在 execute immediate 後面的單引號中。

需要注意,拼接的DDL語言中不能以分號結尾,而將拼接完成的字串賦值給變數時 ,外層是需要分號結尾的。

同時,變數兩側的單引號中的內容需要考慮到空格的存在,否則,拼接出的字串,表名和前後的關鍵詞將會連在一起,導致

DDL語言執行失敗。

oracle excute immediate 單引號轉義

excute immedaite 後接單引號,但是遇到 add xxx default ' ' ,命令中還有單引號的情況,需要轉義。這時候不是用傳統的

\ 反斜槓來轉義,而是用 單引號轉義

execute immediate 'ALTER TABLE E_UC_DEPLOYMENTUMS add sumsurl VARCHAR2(64) default ''ums.huawei.com'' not null';