在存储过程中插入查询不在Oracle中工作

时间:2014-07-31 15:07:52

标签: sql oracle stored-procedures insert

这可能很简单,但我无法弄清楚。我有一个包,它有一个存储过程,负责根据登台表中的信息对主表进行插入,删除或更新。 main和staging表的模式是相同的,除了staging表有一个名为'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表上有索引但在登台

上没有索引

3 个答案:

答案 0 :(得分:0)

你插入的语法很好。

您的选择返回值了吗?

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

感谢您将插件封装在一个块中,但有一个例外,即在插入过程中是否有错误。

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;

答案 1 :(得分:0)

可能有两个原因......

  1. 当执行此插入时,GS_STAGING_CASE表没有任何数据,因此没有插入任何数据。
  2. 它将数据插入GS_CASE表中,但再次被过程中的其他语句删除。
  3. 要确定发生了什么,请尝试使用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;
     /
    

答案 2 :(得分:0)

好的,我无法确定发生了什么,但我重新订购了我的存储过程:首先进行更新和删除,然后将插入移动到最后一个操作。做到这一点,一切正常。

然而,如果有人提出了为什么会这样做的想法或逻辑(也许是Oracle的锁定模型),那就很想知道