Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在存储过程中插入查询在Oracle中不起作用_Sql_Oracle_Stored Procedures_Insert - Fatal编程技术网

Sql 在存储过程中插入查询在Oracle中不起作用

Sql 在存储过程中插入查询在Oracle中不起作用,sql,oracle,stored-procedures,insert,Sql,Oracle,Stored Procedures,Insert,这可能很简单,但我想不出来。我有一个包,它有一个存储过程,负责根据临时表中的信息对主表进行插入、删除或更新。主表和暂存表的架构都相同,只是暂存表有一个名为“ACTION”的列,用于确定要执行的操作 查询更新和删除工作,但存储过程中的insert查询从不在主表中插入数据。下面是我正在使用的存储过程中的insert查询。请帮助我发疯 我还尝试显式地指定一个提交,但没有成功。我试过使用别名GSC,但仍然没有成功 --Inserts INSERT INTO GS_CASE ( SYSTEM,

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

查询更新和删除工作,但存储过程中的insert查询从不在主表中插入数据。下面是我正在使用的存储过程中的insert查询。请帮助我发疯

我还尝试显式地指定一个提交,但没有成功。我试过使用别名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表上有索引,但在staging上没有

插入的语法很好

您是否选择了返回值

如果没有编译错误: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;

有两个原因

执行此插入时,GS_STAGING_案例表没有任何数据,因此未插入任何内容。 它将数据插入GS_案例表中,但再次被过程中的进一步语句删除。 为了确定发生了什么,请尝试使用dbms_output.put_line和SQL%ROWCOUNT打印计数,以查看insert语句插入了多少条记录

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

 -- 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;
 /

好的,我不知道发生了什么,但我重新安排了存储过程:首先进行更新和删除,然后将插入移动到最后一个操作。这样做奏效了,一切都在按应有的方式运转


然而,如果有人提出了一个想法或逻辑来解释为什么这可能与Oracle的锁定模型有关,他会很想知道

您是否遗漏了值部分?插入表col1,col2值从条件所在的表中选择col1_val,col2_val@BrianRobbins它不适用于值您必须使用值或选择向我们显示您的过程的源代码,您有什么错误?您收到错误还是它没有插入预期的行?GSC.ACTION='insert'是否从GS_STAGING_CASE表中检索任何数据。你能从GS_STAGING_案例中运行一个SELECT DISTINCT ACTION并向我们提供结果吗?我目前将我的异常写入一个日志文件,而日志文件中也没有任何内容:让我对所有其他查询进行注释,看看它是否会产生差异OK…这真的很奇怪。注释掉包中的更新和删除查询使我的insert语句起作用,但为什么?如果select返回值,则insert应该起作用。现在您可以尝试另一种方法。这也会更有效率。在集合中大容量收集结果,然后使用Insert进行forall可能是因为在您的算法中,您永远无法适应Insert的条件感谢您的响应,下面是连接到GS_STAGING_CASE=4行插入GS_CASE=0中的数据库行的结果进程已退出。断开与数据库的连接这意味着该表中的这4行不符合where子句,其中GSC.ACTION='INSERT',因为我将您发送的第一条语句thisselect count1从GS_STAGING_中编辑为v_count,其中ACTION='INSERT';