【问题标题】:Converting sql code with select and insert statement into procedure将带有select和insert语句的sql代码转换为过程
【发布时间】:2012-05-08 00:23:06
【问题描述】:

谁能帮我把下面的sql代码转换成程序?我已经阅读了一些 www 来源并得出结论(可能是)它应该是打包的?

TRUNCATE TABLE MY_SCHEME.MAYA;

INSERT INTO MY_SCHEME.MAYA (ID_TEST,
                                  IQ,
                                  DATE_,
                                  COMMENT1)
   SELECT   ID_TEST,
            IQ,
            DATE_,
            COMMENT1
     FROM   MY_SCHEME.STAGE_MAYA
     where STAGE_MAYA.ID_TEST=(select max (ID_TEST) from MY_SCHEME.STAGE_MAYA)

非常感谢!

【问题讨论】:

  • CREATE OR REPLACE PROCEDURE MAY12_PROC IS BEGIN EXECUTE IMMEDIATE ' 放在您的 TRUNCATE 语句之前。在TRUNCATE 语句的末尾,将' 放在MAYA; 之间。在最后一行之后添加; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Error: ' || SQLCODE || ' ' || SQLERRM); END MAY12_PROC;
  • 说得好。我喜欢你“修复”缺少“;”的语法错误的方式。

标签: oracle stored-procedures plsql package


【解决方案1】:

您可以使用PROCEDUREFUNCTION,具体取决于您的最终要求。

一个过程可以完成这项工作,但您必须随后查询MAYA 表以查看您插入了多少条记录。

CREATE OR REPLACE
PROCEDURE maya_insert
IS
BEGIN
   -- Truncate the maya table
   EXECUTE IMMEDIATE 'TRUNCATE TABLE MY_SCHEME.MAYA';
   --
   -- Insert records into maya
   INSERT INTO MY_SCHEME.MAYA 
   (
    ID_TEST,
    IQ,
    DATE_,
    COMMENT1
   )
   SELECT ID_TEST,
          IQ,
          DATE_,
          COMMENT1
     FROM MY_SCHEME.STAGE_MAYA
    WHERE STAGE_MAYA.ID_TEST = (SELECT MAX(ID_TEST)
                                  FROM MY_SCHEME.STAGE_MAYA);
EXCEPTION
   WHEN others
   THEN
      DBMS_OUTPUT.put_line('MAYA_INSERT error: '||sqlerrm);
END maya_insert;

您可能还想在其中添加COMMIT;,除非您在此过程之外提交事务,如果您确实添加了COMMIT;,那么还要在异常部分添加ROLLBACK;。 请注意,TRUNCATE 语句不能回滚,因为它是DDL。如果您需要能够回滚,则必须使用较慢的DELETE 命令,即DML

如果你想知道有多少条记录被插入MAYA,那么使用一个函数:

CREATE OR REPLACE
FUNCTION maya_insert
   RETURN NUMBER
IS
BEGIN
   -- Truncate the maya table
   EXECUTE IMMEDIATE 'TRUNCATE TABLE MY_SCHEME.MAYA';
   --
   -- Insert records into maya
   INSERT INTO MY_SCHEME.MAYA 
   (
    ID_TEST,
    IQ,
    DATE_,
    COMMENT1
   )
   SELECT ID_TEST,
          IQ,
          DATE_,
          COMMENT1
     FROM MY_SCHEME.STAGE_MAYA
    WHERE STAGE_MAYA.ID_TEST = (SELECT MAX(ID_TEST)
                                  FROM MY_SCHEME.STAGE_MAYA);

   -- Return the number of records inserted
   RETURN SQL%ROWCOUNT;
EXCEPTION
   WHEN others
   THEN
      DBMS_OUTPUT.put_line('MAYA_INSERT error: '||sqlerrm);
      RETURN -1;
END maya_insert;

在这里你会得到插入的记录数,如果有错误,你会得到-1返回。如果您需要,请参阅上面关于 COMMIT;ROLLBACK; 的我的 cmets。

关于包裹。包用于在数据库中将逻辑相关的功能过程和其他处理组合在一起。由于您只有一个过程或功能,因此在此阶段无需将其包装在一个包中。 见:http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/09_packs.htm#362

希望对你有帮助...

【讨论】:

  • 我可以再问一个问题吗?创建过程的想法是我将从 unix 批处理文件中调用过程(现在我不知道如何)。另一方面,我可以从 unix 批处理文件执行我的 sql 脚本:我只需将 my_sql.sql 文件放在批处理文件附近并从中调用它(来自 .sh 文件的代码:sqlplus userid=myscheme/0611@TEST_DB 10.33.19.13/test/ DATA_UPLOAD/mysql_script.sql)。正确的做法是:调用存储过程还是调用外部.sql文件?
  • 如果您可以调用 SQL*Plus,那么一旦您调用了它,只需运行 EXECUTE maya_insert; 即可运行您的存储过程。您可以将执行语句放在 .sql 文件中并调用它。
【解决方案2】:

一个包可以包含多个过程、函数、变量和定义。您对包而不是它包含的功能授予授权。一个主要的区别是,当包中的函数代码需要改变时,可以替换包体(创建或替换语法),这样不会导致依赖代码失效。对包外函数的更改总是会导致相关代码失效。

在你的情况下,你需要一个程序

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 1970-01-01
    • 2011-03-04
    • 2017-11-09
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多