我有下面的代码工作正常,但在发布数据时,我得到以下状态代码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;
答案 0 :(得分:0)
你的函数get_orders试图从触发器试图操作的同一个表中读取(插入或更新)。系统只是试图告诉你,你正在尝试读取的表正在被更改,因此任何查询都是可疑的。
你不能写函数只是使用从触发器传递给它的数据吗?触发器已经可以访问旧数据(用于更新)和新数据(用于插入和更新)。只需将其传递给函数。