+ -
当前位置:首页 → 问答吧 → 关于存储过程的问题

关于存储过程的问题

时间:2011-11-28

来源:互联网

表结构如下
create table TBL_REST_WAITING_QUEUE
(
  USER_CODE VARCHAR2(12),
  USER_NAME VARCHAR2(12),
  AGENT_CODE VARCHAR2(12),
  BRAND VARCHAR2(30),
  REQ_MESSAGEID VARCHAR2(20),
  BEGIN_WAITING DATE default SYSDATE,
  QUEUE_LIST VARCHAR2(50),
  REQ_TYPE INTEGER,
  REQ_REST_TYPE VARCHAR2(20),
  REQ_REST_TXT VARCHAR2(100),
  ISENABLEREST INTEGER default 0,
  ISENABLERESTTIME DATE,
  ISENABLEAGENTCODE VARCHAR2(20),
  ISENABLETXT VARCHAR2(100),
  ID INTEGER,
  SENDREMIND INTEGER default 0,
  SENDTIME DATE
)

create table TBL_REST_WAITING_HISTORY
(
  RecordID INTEGER,
  USER_CODE VARCHAR2(12),
  AGENT_CODE VARCHAR2(12),
  BEGIN_WAITING DATE,
  END_WAITING DATE,
  ENDSTATE VARCHAR2(12),
  RECORDCREATE DATE default sysdate not null,
  ENDSUBSTATE VARCHAR2(12),
  BRAND VARCHAR2(20)
)

存储过程如下

create or replace procedure MonitorWaitingQueue(CURRENT_STATUS IN VARCHAR2,
  SUB_STATUS IN VARCHAR2,
  AGENT_CODE IN VARCHAR2) is

  L_AGENT_CODE VARCHAR2(12) := AGENT_CODE;
  L_END_WAITING DATE := sysdate;
  L_ENDSTATE VARCHAR2(12) := CURRENT_STATUS;  
  L_ENDSUBSTATE VARCHAR2(12):= SUB_STATUS;
  cur_restdata tbl_rest_waiting_queue%rowtype;
begin
  select * into cur_restdata from tbl_rest_waiting_queue t
  where t.agent_code = L_AGENT_CODE;  
  
  INSERT INTO tbl_rest_waiting_history
  (USER_CODE,AGENT_CODE,BEGIN_WAITING,END_WAITING,ENDSTATE,ENDSUBSTATE,BRAND)
  values
  (cur_restdata.user_code,cur_restdata.agent_code,cur_restdata.begin_waiting,L_END_WAITING,L_ENDSTATE,L_ENDSUBSTATE,cur_restdata.brand);  
end MonitorWaitingQueue;

在DELPHI中调用存储过程不成功,在PL/SQL Developer中点右键 test,输入参数执行不了, 在Select 附近就出错了,运行不了,不懂 Oracle的存储过程,谢谢大家!



作者: liuhengwinner   发布时间: 2011-11-28

SQL code
create or replace procedure MonitorWaitingQueue(CURRENT_STATUS IN VARCHAR2,
  SUB_STATUS IN VARCHAR2,
  AGENT_CODE IN VARCHAR2) is
  DECLARE
  L_AGENT_CODE VARCHAR2(12);
  L_END_WAITING DATE;
  L_ENDSTATE VARCHAR2(12);
  L_ENDSUBSTATE VARCHAR2(12);
  cur_restdata tbl_rest_waiting_queue%rowtype;
BEGIN
    L_AGENT_CODE:= AGENT_CODE;
    L_END_WAITING:= sysdate;
    L_ENDSTATE:= CURRENT_STATUS;
    L_ENDSUBSTATE:= SUB_STATUS;
    
  SELECT * INTO cur_restdata FROM tbl_rest_waiting_queue t
  WHERE t.agent_code = L_AGENT_CODE;   
   
  INSERT INTO tbl_rest_waiting_history(USER_CODE,AGENT_CODE,BEGIN_WAITING,END_WAITING,ENDSTATE,ENDSUBSTATE,BRAND)
  VALUES
  (cur_restdata.user_code,cur_restdata.agent_code,cur_restdata.begin_waiting,L_END_WAITING,L_ENDSTATE,L_ENDSUBSTATE,cur_restdata.brand);   
  
end MonitorWaitingQueue;

作者: cosio   发布时间: 2011-11-28

select * into cur_restdata from tbl_rest_waiting_queue t
  where t.agent_code = L_AGENT_CODE;  
   
  INSERT INTO tbl_rest_waiting_history
  (USER_CODE,AGENT_CODE,BEGIN_WAITING,END_WAITING,ENDSTATE,ENDSUBSTATE,BRAND)
  values
  (cur_restdata.user_code,cur_restdata.agent_code,cur_restdata.begin_waiting,L_END_WAITING,L_ENDSTATE,L_ENDSUBSTATE,cur_restdata.brand);  
改成
INSERT INTO tbl_rest_waiting_history
(select * into cur_restdata from tbl_rest_waiting_queue t
  where t.agent_code = L_AGENT_CODE;)试下

作者: ulihss   发布时间: 2011-11-28

1楼的代码出错 PLS-00103

作者: liuhengwinner   发布时间: 2011-11-28

是不是t.agent_code = L_AGENT_CODE筛选出来的记录有多条啊?
自行查询一下。
没有数据无法判断。

作者: LuiseRADL   发布时间: 2011-11-28

SELECT * INTO cur_restdata FROM tbl_rest_waiting_queue t
  WHERE t.agent_code = L_AGENT_CODE;
在这个地方你输入数据的时候是不是包ora-01403 未找到数据,这个地方的输入L_AGENT_CODE值一定要能在数据库中找到,不然会报错的。

作者: programmerxiaocai   发布时间: 2011-11-28

提示什么错误

作者: LuiseRADL   发布时间: 2011-11-28

游标for循环试试……
SQL code
create or replace procedure MonitorWaitingQueue(CURRENT_STATUS IN VARCHAR2,
  SUB_STATUS IN VARCHAR2,
  AGENT_CODE IN VARCHAR2)
  is
  L_AGENT_CODE VARCHAR2(12);
  L_END_WAITING DATE;
  L_ENDSTATE VARCHAR2(12);
  L_ENDSUBSTATE VARCHAR2(12);
  cursor cur_restdata is  SELECT *  FROM tbl_rest_waiting_queue t

  WHERE t.agent_code = L_AGENT_CODE;
BEGIN
    L_AGENT_CODE:= AGENT_CODE;
    L_END_WAITING:= sysdate;
    L_ENDSTATE:= CURRENT_STATUS;
    L_ENDSUBSTATE:= SUB_STATUS;

for v_cur_res  in cur_restdata   loop

  INSERT INTO tbl_rest_waiting_history(USER_CODE,AGENT_CODE,BEGIN_WAITING,END_WAITING,ENDSTATE,ENDSUBSTATE,BRAND)
  VALUES
  (cur_restdata.user_code,cur_restdata.agent_code,cur_restdata.begin_waiting,L_END_WAITING,L_ENDSTATE,L_ENDSUBSTATE,cur_restdata.brand);
  end loop;
  commit;

end MonitorWaitingQueue;

作者: dws2004   发布时间: 2011-11-28