【问题标题】:Insert query in stored procedure not working in Oracle在存储过程中插入查询在 Oracle 中不起作用
【发布时间】:2014-09-23 14:40:09
【问题描述】:

这可能很简单,但我无法弄清楚。我有一个包,它有一个存储过程,负责根据临时表中的信息对主表进行插入、删除或更新。主表和暂存表的架构是相同的,只是暂存表有一个名为“ACTION”的列,它确定要执行的操作。

查询更新和删除工作,但存储过程中的插入查询永远不会在主表中插入数据。这是我正在使用的存储过程中的插入查询。请帮助#goingNuts

我也尝试过明确指定提交,但没有成功。我尝试使用别名GSC,仍然没有运气。

--Inserts
INSERT
INTO GS_CASE
  (
    SYSTEM,
    CASE_ID,
    DISPLAY_ID,
    OWNER_FIRSTNAME,
    OWNER_MIDDLENAME,
    OWNER_LASTNAME
  )
SELECT GSC.SYSTEM,
  GSC.CASE_ID,
  GSC.DISPLAY_ID,
  GSC.OWNER_FIRSTNAME,
  GSC.OWNER_MIDDLENAME,
  GSC.OWNER_LASTNAME
FROM GS_STAGING_CASE GSC WHERE GSC.ACTION = 'INSERT';

以下表格架构:

  CREATE TABLE "COSI"."GS_CASE" 
   (    "SYSTEM" VARCHAR2(50 BYTE), 
    "CASE_ID" VARCHAR2(100 BYTE), 
    "DISPLAY_ID" VARCHAR2(100 BYTE), 
    "OWNER_FIRSTNAME" VARCHAR2(1000 BYTE), 
    "OWNER_MIDDLENAME" VARCHAR2(1000 BYTE), 
    "OWNER_LASTNAME" VARCHAR2(1000 BYTE)
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "COSI_DATA" ;


CREATE TABLE GS_STAGING_CASE 
(
  SYSTEM VARCHAR2(50 BYTE) 
, CASE_ID VARCHAR2(100 BYTE) 
, DISPLAY_ID VARCHAR2(100 BYTE) 
, OWNER_FIRSTNAME VARCHAR2(1000 BYTE) 
, OWNER_MIDDLENAME VARCHAR2(1000 BYTE) 
, OWNER_LASTNAME VARCHAR2(1000 BYTE)  
, ACTION VARCHAR2(25 BYTE)
) 
LOGGING 
TABLESPACE COSI_DATA 
PCTFREE 10 
INITRANS 1 
STORAGE 
( 
  INITIAL 65536 
  NEXT 1048576 
  MINEXTENTS 1 
  MAXEXTENTS UNLIMITED 
  BUFFER_POOL DEFAULT 
) 
NOCOMPRESS;

我在 GS_Case 表上有索引,但在暂存时没有

【问题讨论】:

  • 您是否缺少“价值观”部分? Insert into table (col1, col2) values ( Select col1_val, col2_val 从表where条件);
  • @BrianRobbins 它不适用于您必须使用 valuesselect 的值
  • 给我们看看你的程序的源代码,你有什么错误?
  • 您是遇到错误还是没有插入预期的行?
  • GSC.ACTION = 'INSERT' 是否从 GS_STAGING_CASE 表中检索任何数据。您能否运行 SELECT DISTINCT ACTION FROM GS_STAGING_CASE 并向我们提供结果。

标签: sql oracle stored-procedures insert


【解决方案1】:

你插入的语法很好。

您的选择是否返回值?

如果没有编译错误:ORA-00900 到 ORA-01499...

谢谢你把你的insert封装在一个带有异常的block中,看看insert过程中是否有错误。

BEGIN
    INSERT
    INTO GS_CASE
      (
        SYSTEM,
        CASE_ID,
        DISPLAY_ID,
        OWNER_FIRSTNAME,
        OWNER_MIDDLENAME,
        OWNER_LASTNAME
      )
    SELECT GSC.SYSTEM,
      GSC.CASE_ID,
      GSC.DISPLAY_ID,
      GSC.OWNER_FIRSTNAME,
      GSC.OWNER_MIDDLENAME,
      GSC.OWNER_LASTNAME
    FROM GS_STAGING_CASE GSC WHERE GSC.ACTION = 'INSERT';
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Error code : ' || SQLCODE || ' Message : ' || SUBSTR(SQLERRM, 1, 200));
END;

【讨论】:

  • 我目前将我的异常写入日志文件,但日志文件中也没有任何内容 :( 让我注释掉所有其他查询,看看是否有区别
  • 好吧……这真的很奇怪。注释掉包中的更新和删除查询让我的插入语句工作,但为什么??
  • 如果您的选择返回值,您的插入应该可以工作。现在您可以尝试另一种方法。这也会更有效率。将您的结果批量收集到一个集合中,然后使用插入进行 forall
  • 也许是因为在你的算法中你永远不适合插入的条件
【解决方案2】:

好吧,我不知道发生了什么,但我重新排序了我的存储过程:首先进行更新和删除,然后将插入移动到最后一个操作。这样做很有效,并且一切都在正常工作。

但是,如果有人想出一个想法或逻辑背后的原因(可能与 Oracle 的锁定模型有关),很想知道

【讨论】:

    【解决方案3】:

    可能有两个原因...

    1. 执行此插入时,GS_STAGING_CASE 表没有任何数据,因此没有插入任何内容。
    2. 它正在将数据插入到 GS_CASE 表中,但又被过程中的进一步语句删除。

    要确定发生了什么,请尝试使用 dbms_output.put_line 和 SQL%ROWCOUNT 打印计数,以查看插入语句插入了多少条记录

    请参阅下面的示例...关于如何打印的块...

     -- don't forget below set else dbms_output will not print...
     set serveroutput on size 1000000
    
     declare
     v_count number(10);
     v_insert_count number(10);
     begin
    
       /* this will print the number of rows in this table */
       select count(1) Into v_count from GS_STAGING_CASE;
       dbms_output.put_line('Rows in GS_STAGING_CASE = '||v_count);
    
       /* Your insert statement is here. */
    
       /* this should be just after your insert statement */
       v_insert_count := SQL%ROWCOUNT;
       dbms_output.put_line('Rows Inserted into GS_CASE = '||v_insert_count);
    
       commit;
    
     end;
     /
    

    【讨论】:

    • 感谢您的回复,结果如下: Connecting to the database Rows in GS_STAGING_CASE = 4 Rows Inserted into GS_CASE = 0 Process exited。与数据库断开连接
    • 这意味着该表中的这 4 行不符合您的 where 子句 where GSC.ACTION = 'INSERT'
    • 之所以如此,是因为我编辑了您发送的第一条声明
    • select count(1) Into v_count from GS_STAGING_CASE where ACTION = 'INSERT';
    猜你喜欢
    • 1970-01-01
    • 2019-06-03
    • 2016-04-11
    • 2021-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多