【问题标题】:Oracle insert loop - PLS-00103 errorOracle 插入循环 - PLS-00103 错误
【发布时间】:2013-05-20 16:59:10
【问题描述】:

我正在尝试基于循环创建插入语句,但我得到 PLS-00103 在预期以下情况之一时遇到符号“文件结尾”:;

脚本的重点是根据连接表中另一个字段的值从另一个表中选择所有 ID,然后将这些 ID 插入到第二个表中,当然一次插入一行。

这是我目前所拥有的,我不确定为什么会出现错误。行号指向最后一个 CURRENT_DATE 条目。

BEGIN
 For v_apv_cmp_id IN (
                            select distinct
                              paa.APV_CMP_ID
                            from APV_APVR paa
                            join APV_CMP pac on pac.apv_cmp_id = paa.apv_cmp_id
                            join SEC_DISPLAY ssd on ssd.app_level_id = pac.app_level_id
                            where ssd.field_table_name = 'application_name'
                        )
 LOOP
 INSERT INTO APV_APVR
        (APV_APVR_ID, APV_CMP_ID, APVR_USR_ID, ORG_USR_ACV_TS, ORG_USR_NU, LTS_UPD_USR_NU, LTS_UPD_USR_TS)
 values (
        (
          select MAX(APV_APVR_ID)+1 from APV_APVR
        )
          , v_apv_cmp_id
          , 'tssao18'
          , 'tssetac'
          , CURRENT_DATE
          , 'tssetac'
          , CURRENT_DATE
        );
 END LOOP;
END;

【问题讨论】:

  • 你能不能去掉这个值(从 PRE_APV_APVR 中选择 MAX(PRE_APV_APVR_ID)+1 )并用一些虚拟常量替换它,看看它是否有效
  • @可以直接用select代替cursor吗?
  • 好吧,我需要增加那个表的 PK。它仅在插入一行时起作用。我希望能够将它用于多行。
  • 将其转换为单个 SQL 语句并使用 rownum+coalesce((select max(APV_APVR_ID) from APV_APVR),0) 生成 id。只要这是在任何时候插入到表中的唯一会话,它就可以工作
  • v_apv_cmp_id 用作 ID 有点可疑。尝试将其替换为v_apv_cmp_id.apv_cmp_id

标签: oracle plsql


【解决方案1】:
DECLARE
    new_id number;
BEGIN
    SELECT NVL(MAX(APV_APVR_ID),0) + 1 into new_id FROM APV_APVR;
    FOR v_apv_cmp_id IN (
                                SELECT DISTINCT
                                  paa.APV_CMP_ID
                                FROM APV_APVR paa
                                JOIN APV_CMP pac ON pac.apv_cmp_id = paa.apv_cmp_id
                                JOIN SEC_DISPLAY ssd ON ssd.app_level_id = pac.app_level_id
                                WHERE ssd.field_table_name = 'application_name'
                            )
     LOOP
         INSERT INTO APV_APVR
            (APV_APVR_ID, APV_CMP_ID, APVR_USR_ID, ORG_USR_ACV_TS, ORG_USR_NU, LTS_UPD_USR_NU, LTS_UPD_USR_TS)
     VALUES (  new_id
              , v_apv_cmp_id
              , 'tssao18'
              , 'tssetac'
              , CURRENT_DATE
              , 'tssetac'
              , CURRENT_DATE
            );
         new_id := new_id + 1;
     END LOOP;
END;

【讨论】:

  • 我喜欢这种将选择从值部分中取出的方法,但实际上我得到了两个“文件结尾”错误。也许我可以充实他们。新错误在第 2 行:在预期以下之一时遇到符号“文件结尾”: := 。 ( @ % ; 非空范围默认字符
  • 如果添加过程中涉及的表DDL,那会很有帮助
【解决方案2】:
BEGIN
 For v_apv_cmp_id IN (
                            select distinct
                              paa.APV_CMP_ID
                            from APV_APVR paa
                            join APV_CMP pac on pac.apv_cmp_id = paa.apv_cmp_id
                            join SEC_DISPLAY ssd on ssd.app_level_id = pac.app_level_id
                            where ssd.field_table_name = 'application_name'
                        )
 LOOP
 INSERT INTO APV_APVR
        (APV_APVR_ID, APV_CMP_ID, APVR_USR_ID, ORG_USR_ACV_TS, ORG_USR_NU, LTS_UPD_USR_NU, LTS_UPD_USR_TS)
 values (
        (
          select MAX(APV_APVR_ID)+1 from APV_APVR;
        )
          , v_apv_cmp_id
          , 'tssao18'
          , 'tssetac'
          , CURRENT_DATE
          , 'tssetac'
          , CURRENT_DATE
        );
 END LOOP;
END;

【讨论】:

  • 我尝试在值部分的选择末尾添加分号,但没有运气。 :-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 2011-08-06
相关资源
最近更新 更多