Procedure p_sql_valid(In_sql varchar2, out_返回值 out number) is
----------------------------------------------------------------
--功能:综合查询平台-SQL合法性验证
--参数:
--编制:wsy, 2011.07.12
--修改:
---------------------------------------------------------------
v_开始时间 date := sysdate;
v_结束时间 date := sysdate;
v_机构信息 varchar2(50) := '';
v_医生信息 varchar2(50) := '';
v_cursor number; --定义光标
v_result number; --结果
v_sqlerrm varchar2(2000);
begin
Execute Immediate 'ALTER session SET nls_date_format=''yyyy-mm-dd hh24:mi:ss''';
Execute Immediate 'ALTER session SET NLS_TIMESTAMP_FORMAT=''yyyy-mm-dd hh24:mi:ss''';
v_cursor := dbms_sql.open_cursor(2); --为处理打开光标
dbms_sql.parse(v_cursor, In_sql, dbms_sql.native); --分析语句
if instr(In_sql, ':开始时间') > 0 then
dbms_sql.bind_variable(v_cursor, ':开始时间', v_开始时间); --绑定变量--开始时间
end if;
if instr(In_sql, ':结束时间') > 0 then
dbms_sql.bind_variable(v_cursor, ':结束时间', v_结束时间); --绑定变量--结束时间
end if;
if instr(In_sql, ':机构信息') > 0 then
dbms_sql.bind_variable(v_cursor, ':机构信息', v_机构信息); --绑定变量--机构信息
end if;
if instr(In_sql, ':医生信息') > 0 then
dbms_sql.bind_variable(v_cursor, ':医生信息', v_医生信息); --绑定变量--医生信息
end if;
dbms_sql.define_column(v_cursor, 1, v_result); --指定结果列
v_result := dbms_sql.execute(v_cursor);
LOOP
EXIT WHEN dbms_sql.fetch_rows(v_cursor) <= 0; --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
dbms_sql.column_value(v_cursor, 1, v_result); --将当前行的查询结果写入上面定义的列中。
END LOOP;
dbms_sql.close_cursor(v_cursor); --关闭光标
/*Execute Immediate In_SQL into v_result using v_开始时间,v_结束时间,v_机构信息,v_机构信息,v_医生信息,v_医生信息;
out_返回值 := 0;*/
exception
when others then
v_sqlerrm := sqlcode || sqlerrm;
insert into 查询平台日志(id,ipaddress,host,c_sqlerrm,c_objectname,text,rec_time) values(newid,sys_context('userenv', 'ip_address'),sys_context('userenv', 'HOST'),v_sqlerrm,'PKG_指标操作.p_sql_valid',DBMS_UTILITY.format_error_backtrace || 'SQL语句为:' || In_sql,sysdate);
commit;
if dbms_sql.is_open(v_cursor) then
dbms_sql.close_cursor(v_cursor); --关闭光标
end if;
dbms_output.put_line(sqlcode || sqlerrm);
RAISE_APPLICATION_ERROR(-20169, DBMS_UTILITY.format_error_backtrace);
out_返回值 := -1;
end p_sql_valid;
一不小心就报 ora-29471 ,编译通过了。但是偶发性的报错,一旦报错后必须重启数据库,否则这个存储过程就一直报这个错误。
----------------------------------------------------------------
--功能:综合查询平台-SQL合法性验证
--参数:
--编制:wsy, 2011.07.12
--修改:
---------------------------------------------------------------
v_开始时间 date := sysdate;
v_结束时间 date := sysdate;
v_机构信息 varchar2(50) := '';
v_医生信息 varchar2(50) := '';
v_cursor number; --定义光标
v_result number; --结果
v_sqlerrm varchar2(2000);
begin
Execute Immediate 'ALTER session SET nls_date_format=''yyyy-mm-dd hh24:mi:ss''';
Execute Immediate 'ALTER session SET NLS_TIMESTAMP_FORMAT=''yyyy-mm-dd hh24:mi:ss''';
v_cursor := dbms_sql.open_cursor(2); --为处理打开光标
dbms_sql.parse(v_cursor, In_sql, dbms_sql.native); --分析语句
if instr(In_sql, ':开始时间') > 0 then
dbms_sql.bind_variable(v_cursor, ':开始时间', v_开始时间); --绑定变量--开始时间
end if;
if instr(In_sql, ':结束时间') > 0 then
dbms_sql.bind_variable(v_cursor, ':结束时间', v_结束时间); --绑定变量--结束时间
end if;
if instr(In_sql, ':机构信息') > 0 then
dbms_sql.bind_variable(v_cursor, ':机构信息', v_机构信息); --绑定变量--机构信息
end if;
if instr(In_sql, ':医生信息') > 0 then
dbms_sql.bind_variable(v_cursor, ':医生信息', v_医生信息); --绑定变量--医生信息
end if;
dbms_sql.define_column(v_cursor, 1, v_result); --指定结果列
v_result := dbms_sql.execute(v_cursor);
LOOP
EXIT WHEN dbms_sql.fetch_rows(v_cursor) <= 0; --fetch_rows在结果集中移动游标,如果未抵达末尾,返回1。
dbms_sql.column_value(v_cursor, 1, v_result); --将当前行的查询结果写入上面定义的列中。
END LOOP;
dbms_sql.close_cursor(v_cursor); --关闭光标
/*Execute Immediate In_SQL into v_result using v_开始时间,v_结束时间,v_机构信息,v_机构信息,v_医生信息,v_医生信息;
out_返回值 := 0;*/
exception
when others then
v_sqlerrm := sqlcode || sqlerrm;
insert into 查询平台日志(id,ipaddress,host,c_sqlerrm,c_objectname,text,rec_time) values(newid,sys_context('userenv', 'ip_address'),sys_context('userenv', 'HOST'),v_sqlerrm,'PKG_指标操作.p_sql_valid',DBMS_UTILITY.format_error_backtrace || 'SQL语句为:' || In_sql,sysdate);
commit;
if dbms_sql.is_open(v_cursor) then
dbms_sql.close_cursor(v_cursor); --关闭光标
end if;
dbms_output.put_line(sqlcode || sqlerrm);
RAISE_APPLICATION_ERROR(-20169, DBMS_UTILITY.format_error_backtrace);
out_返回值 := -1;
end p_sql_valid;
一不小心就报 ora-29471 ,编译通过了。但是偶发性的报错,一旦报错后必须重启数据库,否则这个存储过程就一直报这个错误。
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货