2010-10-01 59 views
3

有時我想從數據庫表的內容中生成INSERT語句。Oracle相當於SQLite的quote()函數

使用SQLite,我可以這樣做:

SELECT 'INSERT INTO foo (col1, col2) VALUES (' || quote(col1) || ',' || quote(col2) || ');' 
    FROM bar; 

使用Oracle,我要做的:

SELECT 'INSERT INTO foo (col1, col2) VALUES (''' || replace(col1, '''', '''''') || ''',''' || replace(col2, '''', '''''') || ''');' 
    FROM bar; 

而且,它不會與NULL值工作。

有沒有更好的方法?

回答

4

如果你在11g中,我會使用DBMS_ASSERT.ENQUOTE_LITERAL而不是滾動您自己。

+0

我在11.2上,它似乎沒有做OP所要求的。 'enquote_literal('a''b')'返回一個錯誤,而'enquote_literal('a''''b')'返回''a''b''而不是''a''''b'' – Tobia 2018-01-08 11:09:46

1
+1

不知道它對我有幫助。根據我的理解,綁定參數是在程序中準備SQL語句時使用的,並將參數與查詢一起傳遞。 在這種情況下,我想生成可以複製粘貼到純SQL腳本(在Toad,Tora,SQL * Plus或SQLite shell中運行)的查詢。 – Benoit 2010-10-01 09:12:37

+1

ok,那麼它不會幫助:( – 2010-10-01 09:28:46

4

我看不出有任何問題,在你的代碼空。如果有空值,插入的值將是「',這與Oracle中的空值相同(我知道,我知道......)例如

INSERT INTO foo (col1, col2) VALUES ('XXX',''); 

而且工作。

你可以在Oracle中創建QUOTE功能是這樣的:

create function quote (p_text varchar2) return varchar2 is 
begin 
    return '''' || replace (p_text, '''', '''''') || ''''; 
end; 

,然後你SQLLite SQL將在甲骨文工作了。

小心日期和默認格式掩碼:除非您將默認格式掩碼設置爲包含它,否則將丟失源表中的任何時間信息。

alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS'; 

(這需要設置爲當腳本運行時,過相同的值。)

我注意到馬庫斯的有關使用綁定變量點,但這對我來說似乎是那些一個一個即時運行的腳本,然後扔掉,而不是一點點的生產代碼,一遍又一遍地運行,所以我沒有文字問題。像Toad和SQL Developer這樣的工具實際上可以像這樣生成帶文字的插入。

+1

謝謝。我認爲引用函數應該返回'''''||替換(p_text,'''','''''')||'''' '。 – Benoit 2010-10-01 09:27:56

+0

是的,謝謝,我現在糾正了這個功能。 – 2010-10-01 09:31:19

1

您也可以使用Oracle 10g中引入Q-引用操作:

SELECT 'INSERT INTO foo (col1, col2) VALUES (q''#' || col1 || '#'', q''#' || col2 || '#'');' 
    FROM bar; 

結果:

INSERT INTO foo (col1, col2) VALUES (q'#col1's value#', q'#col2's value#'); 
+0

值得一提,但並不安全!想象一下col2的內容是'#'); TRUNCATE TABLE foo; - ,會發生什麼?此外,這隻適用於導入到Oracle數據庫... – Benoit 2010-10-01 14:13:27