使用select和insert语句将sql代码转换为procedure

时间:2012-04-27 08:41:28

标签: oracle stored-procedures plsql package

有人可以帮我将以下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)

非常感谢!

2 个答案:

答案 0 :(得分:2)

根据您的最终要求,您可以使用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;的评论。

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

希望它有所帮助...

答案 1 :(得分:0)

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

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