有时我想从数据库表的内容生成INSERT
语句。
使用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值。
有更好的方法吗?
答案 0 :(得分:4)
我没有看到代码中的空值有任何问题。如果有空值,则插入的值将为'',这与Oracle中的null相同(我知道,我知道......),例如。
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也可以在Oracle中运行。
请注意日期和默认格式掩码:除非您将默认格式掩码设置为包含它,否则您将丢失源表中的任何时间信息,例如
alter session set nls_date_format = 'YYYY-MM-DD HH24:MI:SS';
(这也需要在运行脚本时设置为相同的值。)
我注意到Marcus关于使用绑定变量的观点,但在我看来,这是一次运行然后丢弃的一次性脚本之一,而不是一些会反复运行的生产代码,所以我文字没有问题。像Toad和SQL Developer这样的工具实际上可以生成带有文字插入的工具。
答案 1 :(得分:4)
如果你使用11g,我会使用DBMS_ASSERT.ENQUOTE_LITERAL而不是自己动手。
答案 2 :(得分:1)
答案 3 :(得分:1)
您也可以使用Oracle 10g中引入的Q-quote运算符:
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#');