存储过程问题:
在线等,很难,答出来立即给分。
现在要求是传入一个查询SQL语句,返回这个SQL语句的结果。
前提:SQL语句查询的项目数根据SQL语句不同而不同。SQL语句中可能有函数,子查询等等。非常复杂。 SQL查询出来的数据,要一项一项的检查,发现前两个字符等于“DD”就把这项的值变成“SSS”.
把改变后的结果集用 sys_refcursor 传出来。 我已经想到一部分,但是做不下去了。请大家多多帮忙,解决立即给分,高手们加油阿: function fun_test(in_sql in varchar2, out_refcur out ref_cur) return number is
v_sql varchar2(400);
v_CursorID integer;
v_Dummy INTEGER;
v_ReturnRow INTEGER;
l_columnValue VARCHAR2(4000);
v_errmsg varchar2(20);
l_descTbl dbms_sql.desc_tab;
l_colCnt number; begin
v_sql := in_sql;
v_CursorID := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_CursorID, v_sql, DBMS_SQL.native);
dbms_sql.describe_columns( v_CursorID, l_colCnt, l_descTbl );
for i in 1 .. l_colCnt loop
dbms_sql.define_column(v_CursorID, i, l_columnValue, 4000);
end loop; v_Dummy := DBMS_SQL.EXECUTE(v_CursorID);
loop
v_ReturnRow := DBMS_SQL.FETCH_ROWS(v_CursorID);
if v_ReturnRow = 0 then
exit;
end if;
for i in 1 .. l_colCnt loop
DBMS_SQL.COLUMN_VALUE(v_CursorID, i, l_columnValue);
if not l_columnValue is null then
if length(l_columnValue) > 2 and substr(l_columnValue,1,2) = 'DD' then
l_columnValue := 'SSS';
end if;
end if;
end loop;
end loop;
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
-- open out_refcur for v_sql; exception
when others then
v_errmsg := sqlerrm; end;
在线等,很难,答出来立即给分。
现在要求是传入一个查询SQL语句,返回这个SQL语句的结果。
前提:SQL语句查询的项目数根据SQL语句不同而不同。SQL语句中可能有函数,子查询等等。非常复杂。 SQL查询出来的数据,要一项一项的检查,发现前两个字符等于“DD”就把这项的值变成“SSS”.
把改变后的结果集用 sys_refcursor 传出来。 我已经想到一部分,但是做不下去了。请大家多多帮忙,解决立即给分,高手们加油阿: function fun_test(in_sql in varchar2, out_refcur out ref_cur) return number is
v_sql varchar2(400);
v_CursorID integer;
v_Dummy INTEGER;
v_ReturnRow INTEGER;
l_columnValue VARCHAR2(4000);
v_errmsg varchar2(20);
l_descTbl dbms_sql.desc_tab;
l_colCnt number; begin
v_sql := in_sql;
v_CursorID := DBMS_SQL.OPEN_CURSOR;
DBMS_SQL.PARSE(v_CursorID, v_sql, DBMS_SQL.native);
dbms_sql.describe_columns( v_CursorID, l_colCnt, l_descTbl );
for i in 1 .. l_colCnt loop
dbms_sql.define_column(v_CursorID, i, l_columnValue, 4000);
end loop; v_Dummy := DBMS_SQL.EXECUTE(v_CursorID);
loop
v_ReturnRow := DBMS_SQL.FETCH_ROWS(v_CursorID);
if v_ReturnRow = 0 then
exit;
end if;
for i in 1 .. l_colCnt loop
DBMS_SQL.COLUMN_VALUE(v_CursorID, i, l_columnValue);
if not l_columnValue is null then
if length(l_columnValue) > 2 and substr(l_columnValue,1,2) = 'DD' then
l_columnValue := 'SSS';
end if;
end if;
end loop;
end loop;
DBMS_SQL.CLOSE_CURSOR(v_CursorID);
-- open out_refcur for v_sql; exception
when others then
v_errmsg := sqlerrm; end;
再来个人,我当散分了。