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