无法发布状态代码为201的数据

时间:2014-09-08 09:39:29

标签: oracle plsql

我有下面的代码工作正常,但在发布数据时,我得到以下状态代码201,同时将数据插入我的表,并在更新表时,我得到变异表错误。之前我能够将新的记录集发布到我的表中,但现在我没有在URL上看到任何记录。

以下是代码:

  CREATE OR REPLACE TRIGGER get_orders_trig BEFORE
  INSERT OR UPDATE ON orders FOR EACH ROW DECLARE V_RET CLOB;
  BEGIN
  dbms_output.put_line('fired-0');
--  if inserting then
--   insert into emp_rows_to_be_processed(p_id) values ( :new.id);
--
--   end if;
    IF inserting THEN
    insert into orders_rows_to_be_processed
    (order_id,source_system) values ( :new.order_id,:new.source_system);

    if  updating 
    then 

   update orders_rows_to_be_processed set 

    source_system = :new.source_system
    where order_id = :new.order_id;

     END IF;
    V_RET := post_json_data_fnc (:new.order_id,:new.source_system);
    END;
    create or replace FUNCTION post_json_data_fnc(

     v_order_id IN NUMBER,
     v_src_system IN VARCHAR2)
      RETURN CLOB
    IS
   req utl_http.req;
   res utl_http.resp;
   url varchar2(200);
   l_clob CLOB;
   l_xml CLOB;
   l_txt CLOB;
    l_http_resp utl_http.resp;

--content varchar2(4000) := '{"name":"u14", "pass": "123","mail": "user@a.om"}';
     BEGIN
    dbms_output.put_line('Entered the proc');
         URL := 'http call ';

        l_xml   := json_util_pkg.ref_cursor_to_json                 (orders_spec.
          get_orders(v_order_id,v_src_system));
        req := utl_http.begin_request(URL, 'POST',' HTTP/1.1');
        utl_http.set_header(req, 'user-agent', 'mozilla/4.0');
        utl_http.set_header(req, 'content-type', 'application/json');
        utl_http.set_header(req, 'Content-Length', LENGTH(l_xml));
         l_txt := l_xml;
        utl_http.write_text(req, l_txt);
         res := utl_http.get_response(req);
         utl_http.read_text(res,l_txt);

      dbms_output.put_line ('status code: ' || res.status_code);
      dbms_output.put_line ('reason phrase: ' || res.reason_phrase);
       UTL_HTTP.END_RESPONSE(res);
       dbms_output.put_line(l_txt);

            return l_txt;
          EXCEPTION

       WHEN UTL_HTTP.END_OF_BODY THEN
          UTL_HTTP.END_RESPONSE(res);
          END;


                create or replace PACKAGE body orders_spec
       AS
        FUNCTION get_orders(
       v_order_id IN NUMBER,
       v_src_system IN VARCHAR2)
     RETURN sys_refcursor
     AS
      l_returnvalue sys_refcursor;
    BEGIN
      OPEN l_returnvalue FOR SELECT * FROM orders WHERE 
      order_id = v_order_id and source_system = v_src_system; 
       RETURN l_returnvalue;
     dbms_output.put_line('function called');
       END get_orders;
      END orders_spec;

1 个答案:

答案 0 :(得分:0)

你的函数get_orders试图从触发器试图操作的同一个表中读取(插入或更新)。系统只是试图告诉你,你正在尝试读取的表正在被更改,因此任何查询都是可疑的。

你不能写函数只是使用从触发器传递给它的数据吗?触发器已经可以访问旧数据(用于更新)和新数据(用于插入和更新)。只需将其传递给函数。