Oracle : Export select statement result set as INSERT SQL Statements 类似于 SQL developer export
Oracle : Export select statement result set as INSERT SQL Statements similar to SQL developer export
我正在寻找一种解决方案来创建 SQL INSERT 语句 使用 PL/SQL 脚本 为 select 语句结果集。在 SQL 开发人员工具(导出 --> 格式插入)中寻找类似功能,但我希望将解决方案作为脚本而不是使用任何工具。
我参考了以下解决方案。但是,我想知道是否有更好的方法来解决这个问题,因为解决方案很旧而且不是很简单。
EXPORT AS INSERT STATEMENTS: But in SQL Plus the line overrides 2500 characters!
不是真的PL/SQL,但基本SQL可以处理像这样简单的请求:
set linesize 2000
set pagesize 0
spool c:\myoutput.txt
select 'INSERT INTO SAMPLE_TABLE VALUES ('''||
C01||''','||C02||','||C03||','||C04||','''||C05||''','''||
C06||''','''||C07||''','||C08||','||C09||','''||C10||''','''||
C10||''','''||C11||''','''||C12||''','''||C13||''','''||C14||''','''||
C15||''','''||C16||''');'
from sample_table;
spool off
注意:这是使用您在 post 中引用的 URL 中的 table 示例。 URL中的例子中,C02、C03、C04、C08、C09都是NUMBER,其余为CHAR或VARCHAR2
作为脚本你说...
使用 SQLcl - 它是 SQL 开发人员的命令行界面。
您可以创建 .bat 或 .sh 脚本来启动 SQLcl,运行 您的查询,将其假脱机到文件中,无需编写任何代码。
set pagesize...
set head...
set feedback...
spool...
set sqlformat insert
select * from sample_table;
spool off
exit
我刚刚为我的问题找到了一个简单的解决方案 使用 oracle 提示 ("insert")。 这也会自动处理数据类型。我的 table 只有字符串和数字数据类型,所以它对我来说工作正常。我没有测试其他数据类型的解决方案。但是,我希望它也适用于其他数据类型。
set linesize 2000
set pagesize 10
spool "c:\myoutput.txt";
select /*insert*/ * from SAMPLE_TABLE;
spool off;
set sqlformat insert
在我的例子中,最初它在 SQL 开发人员中不起作用,因为版本是 3.2 版并且在脚本输出中产生消息:
oracle unknown set option sqlformat insert
当我升级到 SQL 开发人员 4.2 及更高版本 并使用 "Run Script" (F5) 我能够导出 select记录为插入脚本。
您可以根据需要使用 for 循环和 dbms 输出来完成它,即使是像 Toad 这样的合并语句,只要使缓冲区足够大即可:
BEGIN
FOR r_cur IN ( SELECT column_one,
column_two,
column_three,
column_value
FROM some_table
WHERE column_one LIKE 'something%'
ORDER BY column_one, column_two, column_three)
LOOP
DBMS_OUTPUT.put_line (
'MERGE INTO some_table A USING
(SELECT\n
''' || r_cur.column_one || ''' as column_one,
''' || r_cur.column_two || ''' as column_two,
''' || r_cur.column_three || ''' as column_three,
''' || r_cur.column_value || ''' as column_value
FROM DUAL) B
ON (A.column_one = B.column_one and A.column_two = B.column_two and A.column_three = B.column_three)
WHEN NOT MATCHED THEN
INSERT (
column_one, column_two, column_three, column_value)
VALUES (
B.column_one, B.column_two, B.column_three, B.column_value)
WHEN MATCHED THEN
UPDATE SET
A.column_value = B.column_value;
' );
END LOOP;
END;
/
我正在寻找一种解决方案来创建 SQL INSERT 语句 使用 PL/SQL 脚本 为 select 语句结果集。在 SQL 开发人员工具(导出 --> 格式插入)中寻找类似功能,但我希望将解决方案作为脚本而不是使用任何工具。
我参考了以下解决方案。但是,我想知道是否有更好的方法来解决这个问题,因为解决方案很旧而且不是很简单。
EXPORT AS INSERT STATEMENTS: But in SQL Plus the line overrides 2500 characters!
不是真的PL/SQL,但基本SQL可以处理像这样简单的请求:
set linesize 2000
set pagesize 0
spool c:\myoutput.txt
select 'INSERT INTO SAMPLE_TABLE VALUES ('''||
C01||''','||C02||','||C03||','||C04||','''||C05||''','''||
C06||''','''||C07||''','||C08||','||C09||','''||C10||''','''||
C10||''','''||C11||''','''||C12||''','''||C13||''','''||C14||''','''||
C15||''','''||C16||''');'
from sample_table;
spool off
注意:这是使用您在 post 中引用的 URL 中的 table 示例。 URL中的例子中,C02、C03、C04、C08、C09都是NUMBER,其余为CHAR或VARCHAR2
作为脚本你说...
使用 SQLcl - 它是 SQL 开发人员的命令行界面。
您可以创建 .bat 或 .sh 脚本来启动 SQLcl,运行 您的查询,将其假脱机到文件中,无需编写任何代码。
set pagesize...
set head...
set feedback...
spool...
set sqlformat insert
select * from sample_table;
spool off
exit
我刚刚为我的问题找到了一个简单的解决方案 使用 oracle 提示 ("insert")。 这也会自动处理数据类型。我的 table 只有字符串和数字数据类型,所以它对我来说工作正常。我没有测试其他数据类型的解决方案。但是,我希望它也适用于其他数据类型。
set linesize 2000
set pagesize 10
spool "c:\myoutput.txt";
select /*insert*/ * from SAMPLE_TABLE;
spool off;
set sqlformat insert
在我的例子中,最初它在 SQL 开发人员中不起作用,因为版本是 3.2 版并且在脚本输出中产生消息:
oracle unknown set option sqlformat insert
当我升级到 SQL 开发人员 4.2 及更高版本 并使用 "Run Script" (F5) 我能够导出 select记录为插入脚本。
您可以根据需要使用 for 循环和 dbms 输出来完成它,即使是像 Toad 这样的合并语句,只要使缓冲区足够大即可:
BEGIN
FOR r_cur IN ( SELECT column_one,
column_two,
column_three,
column_value
FROM some_table
WHERE column_one LIKE 'something%'
ORDER BY column_one, column_two, column_three)
LOOP
DBMS_OUTPUT.put_line (
'MERGE INTO some_table A USING
(SELECT\n
''' || r_cur.column_one || ''' as column_one,
''' || r_cur.column_two || ''' as column_two,
''' || r_cur.column_three || ''' as column_three,
''' || r_cur.column_value || ''' as column_value
FROM DUAL) B
ON (A.column_one = B.column_one and A.column_two = B.column_two and A.column_three = B.column_three)
WHEN NOT MATCHED THEN
INSERT (
column_one, column_two, column_three, column_value)
VALUES (
B.column_one, B.column_two, B.column_three, B.column_value)
WHEN MATCHED THEN
UPDATE SET
A.column_value = B.column_value;
' );
END LOOP;
END;
/