SQL 具有特定数据的开发人员副本 Table
SQL Developer Copy Table with Specific Data
所以我有一个 table 包含 10000 多条记录,标题为 ID、PRODUCT、U、C、ELONG...(还有各种标题)。
此 table 在 PRODUCT 列中有 4 个可能的条目,CAPL、ZOD、HR 和 PKL。我想将其拆分,以便在 SQL 开发人员中有一个 table 仅用于 'CAPL' 数据,仅 ZOD 数据仅 HR 数据和仅 PKL 数据。我有 运行 以下内容:
declare
l_sql varchar2(32767);
c_tab_comment varchar2(32767);
procedure run(p_sql varchar2) as
begin
execute immediate p_sql;
end;
begin
run('create table "MP".CAPLAAAA as select * from "MP"."LASTQTTBL" where PRODUCT = "CAPL"');
select comments into c_tab_comment from sys.all_TAB_comments where owner = 'MP' and table_name = 'LASTQTTBL' and comments is not null;
run('comment on table MP.CAPLAAAA is '||''''||REPLACE(c_tab_comment, q'[']', q'['']')||'''');
for tc in (select column_name from sys.all_tab_cols where owner = 'MP' and table_name = 'LASTQTTBL')
loop
for c in (select comments from sys.all_col_comments where owner = 'MP' and table_name = 'LASTQTTBL' and column_name=tc.column_name)
loop
run ('comment on column MP.CAPLAAAA.'||tc.column_name||' is '||''''||REPLACE(c.comments, q'[']', q'['']')||'''');
end loop;
end loop;
EXCEPTION
WHEN OTHERS THEN NULL;
end;
但是没有任何结果,即使在 运行ning 之后它在脚本输出中出现 'PL/SQL procedure successfully completed.'。
我哪里出错了吗?非常感谢您的帮助。
是否需要保留所有table条评论?以下脚本创建与 TEST table 中的产品数量相关的 4 table。
DROP TABLE TEST;
/
CREATE TABLE TEST(A VARCHAR2(20),
B VARCHAR2(20),
C VARCHAR2(20),
D VARCHAR2(20),
PRODUCT VARCHAR2(20)
);
/
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'CAPL');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'CAPL');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'ZOD');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'ZOD');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'HR');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'HR');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'PKL');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'PKL');
/
SET SERVEROUTPUT ON;
DECLARE
v_Sql VARCHAR2(100);
v_CodeResp INTEGER;
v_MsgResp VARCHAR2(500);
v_Name VARCHAR2(10);
BEGIN
FOR x IN (SELECT PRODUCT
FROM TEST
GROUP BY PRODUCT)
LOOP
v_Name := x.PRODUCT;
v_Sql := 'CREATE TABLE ' || v_Name || 'AAAA AS SELECT A, B, C, D, PRODUCT FROM TEST WHERE PRODUCT = ' || ''''||v_Name||'''';
EXECUTE IMMEDIATE(v_Sql);
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
v_CodeResp := SQLCODE;
v_MsgResp := v_CodeResp || ' ' || SUBSTR(SQLERRM, 300);
DBMS_OUTPUT.PUT_LINE(v_MsgResp);
END;
所以我有一个 table 包含 10000 多条记录,标题为 ID、PRODUCT、U、C、ELONG...(还有各种标题)。 此 table 在 PRODUCT 列中有 4 个可能的条目,CAPL、ZOD、HR 和 PKL。我想将其拆分,以便在 SQL 开发人员中有一个 table 仅用于 'CAPL' 数据,仅 ZOD 数据仅 HR 数据和仅 PKL 数据。我有 运行 以下内容:
declare
l_sql varchar2(32767);
c_tab_comment varchar2(32767);
procedure run(p_sql varchar2) as
begin
execute immediate p_sql;
end;
begin
run('create table "MP".CAPLAAAA as select * from "MP"."LASTQTTBL" where PRODUCT = "CAPL"');
select comments into c_tab_comment from sys.all_TAB_comments where owner = 'MP' and table_name = 'LASTQTTBL' and comments is not null;
run('comment on table MP.CAPLAAAA is '||''''||REPLACE(c_tab_comment, q'[']', q'['']')||'''');
for tc in (select column_name from sys.all_tab_cols where owner = 'MP' and table_name = 'LASTQTTBL')
loop
for c in (select comments from sys.all_col_comments where owner = 'MP' and table_name = 'LASTQTTBL' and column_name=tc.column_name)
loop
run ('comment on column MP.CAPLAAAA.'||tc.column_name||' is '||''''||REPLACE(c.comments, q'[']', q'['']')||'''');
end loop;
end loop;
EXCEPTION
WHEN OTHERS THEN NULL;
end;
但是没有任何结果,即使在 运行ning 之后它在脚本输出中出现 'PL/SQL procedure successfully completed.'。
我哪里出错了吗?非常感谢您的帮助。
是否需要保留所有table条评论?以下脚本创建与 TEST table 中的产品数量相关的 4 table。
DROP TABLE TEST;
/
CREATE TABLE TEST(A VARCHAR2(20),
B VARCHAR2(20),
C VARCHAR2(20),
D VARCHAR2(20),
PRODUCT VARCHAR2(20)
);
/
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'CAPL');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'CAPL');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'ZOD');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'ZOD');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'HR');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'HR');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'PKL');
INSERT INTO TEST VALUES('DATA A', 'DATA B,', 'DATA C', 'DATA D', 'PKL');
/
SET SERVEROUTPUT ON;
DECLARE
v_Sql VARCHAR2(100);
v_CodeResp INTEGER;
v_MsgResp VARCHAR2(500);
v_Name VARCHAR2(10);
BEGIN
FOR x IN (SELECT PRODUCT
FROM TEST
GROUP BY PRODUCT)
LOOP
v_Name := x.PRODUCT;
v_Sql := 'CREATE TABLE ' || v_Name || 'AAAA AS SELECT A, B, C, D, PRODUCT FROM TEST WHERE PRODUCT = ' || ''''||v_Name||'''';
EXECUTE IMMEDIATE(v_Sql);
END LOOP;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
v_CodeResp := SQLCODE;
v_MsgResp := v_CodeResp || ' ' || SUBSTR(SQLERRM, 300);
DBMS_OUTPUT.PUT_LINE(v_MsgResp);
END;