【问题标题】:How to use Insert query within for loop in PLSQL using implicit cursor如何使用隐式游标在PLSQL的for循环中使用插入查询
【发布时间】:2022-06-27 22:05:17
【问题描述】:

我有一个现有的表,我想在另一个表中为给定的第一个表的每一行添加一些条目。 我将我的 PLSQL 命令编写为:

BEGIN
    FOR record in (select cola_guid, hapc_guid, tar_guid from tabA) LOOP
            
            select count(*) INTO v_record_exists
                    from p where
                    p.cola_guid = record.cola_guid;

            IF v_record_exists = 0 THEN
                    execute immediate 'insert into NTABLE (tar_guid, PC_NAE, PCV) values (record.tar_guid, ' || '''abcd''' || ', ' || '''val1''' || ')';
            ELSE
                    execute immediate 'insert into NTABLE (tar_guid, PC_NAE, PCV) values (record.tar_guid, ' || '''abcd''' || ', ' || '''val2''' || ')';
            END IF;

            execute immediate 'insert into NTABLE (tar_guid, PC_NAE, PCV) values (record.tar_guid, ' || '''RA_hapc_guid''' || ', record.hapc_guid)';
            execute immediate 'insert into NTABLE (tar_guid, PC_NAE, PCV) select record.tar_guid, PC_NAE, PCV from  p where record.cola_guid = p.cola_guid and PC_NAE = ' || '''propVal''' || ' ';
    END LOOP;
END;

现在我收到错误:

ORA-00984:此处不允许列

排队:

执行立即'插入NTABLE(tar_guid,PC_NAE,PCV)值(record.tar_guid,'||'''abcd'''||','||'''val1'''||') ';

我是 PLSQL 世界的新手,但我确实尝试过分类和谷歌搜索但无法解决。请指导和帮助。

【问题讨论】:

    标签: plsql sql-insert


    【解决方案1】:

    您无需在此处使用动态 sql - 您知道要插入/选择的所有列和表,因此您可以直接在 SQL 语句中使用 PL/SQL 变量。

    此外,当您在 PL/SQL 中编写 SQL 时,出于性能原因(以及易于阅读、维护和调试),您应该考虑基于集合。

    完全可以在一个插入语句中完成所有插入操作,您可以将其放入一个过程中。

    BEGIN
      INSERT INTO ntable (tar_guid, pc_nae, pcv)
      WITH results AS (SELECT t.cola_guid,
                              t.hapc_guid,
                              t.tar_guid,
                              CASE WHEN EXISTS (SELECT NULL FROM p WHERE p.cola_guid = t.cola_guid) THEN 'val1' ELSE 'val2' END val
                       FROM   taba t)
      SELECT tar_guid,
             'abcd' pc_nae,
             val pcv
      FROM   results
      UNION ALL
      SELECT tar_guid,
             'RA_hapc_guid' pc_nae
             hapc_guid pcv
      UNION ALL
      SELECT p.tar_guid,
             p.pc_nae,
             p.pcv
      FROM   results r
             inner JOIN p ON r.cola_guid = p.cola_guid
      WHERE  p.pc_nae = 'propVal';
    END;
    /
    

    不要忘记您需要根据需要提交/回滚!

    【讨论】:

      猜你喜欢
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-31
      • 1970-01-01
      相关资源
      最近更新 更多