Oracle 如何使用pl/sql进行批处理操作

Oracle 如何使用pl/sql进行批处理操作,oracle,plsql,Oracle,Plsql,我必须为许多表添加主键,我从stackoverflow为一个表获得了以下脚本: ALTER TABLE table1 ADD ID NUMBER(12); CREATE SEQUENCE table1Seq START WITH 1; UPDATE table1 SET table1ID = table1Seq.NEXTVAL; ALTER TABLE table1 ADD PRIMARY KEY (ID); CREATE OR REPLACE TRIGGER table1PKSet BEFOR

我必须为许多表添加主键,我从stackoverflow为一个表获得了以下脚本:

ALTER TABLE table1 ADD ID NUMBER(12);
CREATE SEQUENCE table1Seq START WITH 1;
UPDATE table1 SET table1ID = table1Seq.NEXTVAL;
ALTER TABLE table1 ADD PRIMARY KEY (ID);
CREATE OR REPLACE TRIGGER table1PKSet
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
  :NEW.ID := table1Seq.NEXTVAL;
END;
/
但是现在我已经对用户的所有表执行了相同的操作


因此,我想知道是否可以使用pl/sql循环用户的所有表,并执行上述操作?

在开始之前,我只想说这太糟糕了。如果您正在创建自动化数据库创建的脚本,我将放弃下面的查询,只进行复制/粘贴,因为这太可怕了,它不属于您的数据库部署脚本

询问 这有什么用? 基本上,它会获得一个表列表,并动态构建SQL以执行所涉及的各种任务。executeimmediate获取我们构建SQL的字符串并执行它。CHR10的污秽是一条新线。我希望在那里有空白,因为我不知道省略它会如何影响Oracle的解析。注意,在一些地方,我们将表名直接连接到其他文本,以生成序列或PK约束名

如果在创建过程中引用了表名,并且使用了一些小写字符,则可能会出错,也可能不会出错。如果它确实出错,请记住每个语句都涉及一个提交。一个错误意味着这个过程完成了一半。如果架构不是当前用户,它也会失败。在构建SQL时,需要将USER_表更改为ALL_表,并在where子句中添加适当的筛选器,并在表名前面添加模式,以使其在另一个模式上工作

一个实际工作的SQLFiddle:我不敢相信这在SQLFiddle上真的起作用。在本例中,我们感兴趣的查询在模式定义中结束,因为SQLFIDLE只允许查询中的SELECT


祝你好运。你会需要它的。不要朝自己的脚开枪。

在我开始之前,我只想说这太恶心了。如果您正在创建自动化数据库创建的脚本,我将放弃下面的查询,只进行复制/粘贴,因为这太可怕了,它不属于您的数据库部署脚本

询问 这有什么用? 基本上,它会获得一个表列表,并动态构建SQL以执行所涉及的各种任务。executeimmediate获取我们构建SQL的字符串并执行它。CHR10的污秽是一条新线。我希望在那里有空白,因为我不知道省略它会如何影响Oracle的解析。注意,在一些地方,我们将表名直接连接到其他文本,以生成序列或PK约束名

如果在创建过程中引用了表名,并且使用了一些小写字符,则可能会出错,也可能不会出错。如果它确实出错,请记住每个语句都涉及一个提交。一个错误意味着这个过程完成了一半。如果架构不是当前用户,它也会失败。在构建SQL时,需要将USER_表更改为ALL_表,并在where子句中添加适当的筛选器,并在表名前面添加模式,以使其在另一个模式上工作

一个实际工作的SQLFiddle:我不敢相信这在SQLFiddle上真的起作用。在本例中,我们感兴趣的查询在模式定义中结束,因为SQLFIDLE只允许查询中的SELECT


祝你好运。你会需要它的。不要打自己的脚。

您可以使用数据字典查询元数据并编写脚本以执行建议。您可以使用数据字典查询元数据并编写脚本以执行建议。感谢您的回复。所以光标表是从用户表中选择*的,其中表名!='手动_DONE_TABLE';用于为给定用户选择所有表,我想知道是否可以筛选没有主表的表?因为上面的操作集中在没有主键的表上。它应该是可行的,但可能只有在连接或嵌套的SELECT on USER_约束下。用户表没有任何关于主键的信息。通过谷歌搜索找到了这个查询,以获取表的主键约束:。非常感谢,我将尝试一下。:呃,我无法抗拒。我继续努力,把它弄明白了。更新了答案和SQL Fiddle。感谢您的回复。所以光标表是从用户表中选择*的,其中表名!='手动_DONE_TABLE';用于为给定用户选择所有表,我想知道是否可以筛选没有主表的表?因为上面的操作集中在没有主键的表上。它应该是可行的,但可能只有在连接或嵌套的SELECT on USER_约束下。用户表没有任何关于主键的信息。通过谷歌搜索找到了这个查询,以获取表的主键约束:。非常感谢,我将尝试一下。:呃,我无法抗拒。我继续努力,把它弄明白了。更新了答案和SQL FIDLE。
DECLARE
    CURSOR TABLES IS SELECT * FROM USER_TABLES
                     WHERE 0 = (SELECT COUNT(*)
                                FROM USER_CONSTRAINTS
                                WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME 
                                AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P'
                               );
BEGIN
    FOR T IN TABLES LOOP
        EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD ID NUMBER(12)';
        EXECUTE IMMEDIATE 'CREATE SEQUENCE '||T.TABLE_NAME||'Seq START WITH 1';
        EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||T.TABLE_NAME||'Seq.NEXTVAL';
        EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD PRIMARY KEY (ID)';
        EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||T.TABLE_NAME||'PKSet '||CHR(10)
                          ||'BEFORE INSERT ON '||T.TABLE_NAME||' '||CHR(10)
                          ||'FOR EACH ROW '||CHR(10)
                          ||'BEGIN '||CHR(10)
                          ||':NEW.ID := '||T.TABLE_NAME||'Seq.NEXTVAL; '||CHR(10)
                          ||'END; ';
    END LOOP;
END;
/