【问题标题】:PL/SQL: INSERT INTO Table Based On Derived ValuePL/SQL:基于派生值插入表
【发布时间】:2017-04-19 23:52:45
【问题描述】:

我想运行一个 SELECT 语句,导出一个值,然后将该值插入到表中。我的代码如下所示:

CREATE OR REPLACE PROCEDURE ADDR 
  IS
  L_SQL_ERR_MSG   VARCHAR2 (250);

  CURSOR CUR_ADDRESSES
  IS         
  SELECT 
            CASE WHEN PPD.SP_ID ='11' 
                 THEN 'BILLING' 
                 WHEN PP_D.SP_ID ='157' 
                 THEN 'MAILING' 
                 ELSE NULL
                 END AS TYPE

            FROM
            SPEC_DEGREE PP_D
            WHERE PP_D.SP_ID ='11' --Currently just to extract one row
            AND PP_D.DEGREE ='DO';

 BEGIN
  FOR RCD IN CUR_ADDRESSES
  LOOP
     BEGIN
        INSERT INTO ADDITIONAL_ADDR (
                                   ID,
                                   NUM,
                                   STATE,
                                   START_DATE,
                                   TYPE)

             VALUES (
             '1',
             '12345',
             'CT',
             TO_DATE('01-01-2020', 'MM-DD-YYYY'),
             TYPE );

     EXCEPTION
        WHEN OTHERS
        THEN
           L_SQL_ERR_MSG := SQLERRM;

           DBMS_OUTPUT.put_line (SQLERRM);
     END;
  END LOOP;
END ADDR;
/

我现在知道我无法将列添加到插入语句中,但我希望有一种方法可以添加这个派生值。对 PL/SQL 来说相当新。有什么想法吗?如果您需要更多详细信息,请告诉我。

【问题讨论】:

  • 这里不清楚。您想向表中不存在的列插入值吗?你不想创建一个视图吗?
  • 没有。这需要加载到表中。
  • 那么,当没有对应的列时,您希望如何将值保存到表中?您要么必须将列添加到表中,要么为选择创建一个视图,然后添加计算值。
  • 我很抱歉。这是一个现有的表。我将值插入到已经创建的表 ADDITIONAL_ADDR 中。

标签: oracle plsql toad


【解决方案1】:

你不需要光标:

CREATE OR REPLACE PROCEDURE ADDR
IS
BEGIN
  INSERT INTO ADDITIONAL_ADDR (
    ID,
    NUM,
    STATE,
    START_DATE,
    TYPE
  )
  SELECT '1',
         '12345',
         'CT',
         DATE '2020-01-01',
         CASE WHEN SP_ID ='11'  THEN 'BILLING' 
              WHEN SP_ID ='157' THEN 'MAILING' 
              END
  FROM   SPEC_DEGREE
  WHERE  SP_ID ='11' --Currently just to extract one row
  AND    DEGREE ='DO';
END ADDR;
/

【讨论】:

  • 假设我需要添加多条记录。我不需要光标吗?
  • 不,您不需要光标。用您尝试解决的问题的示例更新您的问题,您将获得更具体的答案。
  • 这回答了我的问题。谢谢。
  • 根据我的经验,正确构造的“插入选择”消除了对游标的需要。 Oracle PL/SQL 有一个美妙的 for 循环,它消除了创建游标的需要,除非您有某种动态 SQL 需求。它们还消除了您必须使用游标执行的提取簿记。
猜你喜欢
  • 2016-05-09
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多