关于ORACLE数据库中函数和存教过程的问题

zpos 2008-09-10 11:42:46
我是个ORACLE初学者,我是FUNCTION中编写了一个函数,函数的功能是返回一个动态SQL语句,现在问题是怎样才能在存储过程中调用这个函数呢,有代码麻烦给参考下,谢谢。
...全文
118 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
v888 2008-09-10
  • 打赏
  • 举报
回复
7楼说的很详细了
代码摆渡人 2008-09-10
  • 打赏
  • 举报
回复
使用 EXECUTE IMMEDIATE
zhouwei21cn 2008-09-10
  • 打赏
  • 举报
回复
先自定义一个游标tcursor
再存储过程中定义变量参数加上cur out tcursor,然后open cur for SQL语句
oracledbalgtu 2008-09-10
  • 打赏
  • 举报
回复

CREATE OR REPLACE FUNCTION get_sql(p_table VARCHAR2) RETURN VARCHAR2 IS
l_str VARCHAR2(1000);
BEGIN
l_str:='select ename from '||p_table;
RETURN l_str;
END;
/

CREATE OR REPLACE PROCEDURE proc_test(p_table VARCHAR2,p_out OUT Sys_Refcursor) IS
l_str VARCHAR2(1000);
BEGIN
l_str:=get_sql(p_table);
dbms_output.put_line(l_str);
OPEN p_out FOR l_str;
END;
/

DECLARE
l_c SYS_REFCURSOR;
l_v VARCHAR2(100);
BEGIN
proc_test('scott.emp',l_c);
LOOP
FETCH l_c INTO l_v;
dbms_output.put_line(l_v);
EXIT WHEN l_c%NOTFOUND;
END LOOP;
END;
/
输出:
select ename from scott.emp
SMITH
ALLEN
WARD
JONES
MARTIN
BLAKE
CLARK
SCOTT
KING
TURNER
ADAMS
JAMES
FORD
MILLER
MILLER

[Quote=引用 5 楼 zpos 的回复:]
哦,我的意思是在存储过程中执行函数返回的SQL,然后返回一个数据集。
[/Quote]
vc555 2008-09-10
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080905/11/86bb6a5a-e747-4cb9-bb32-7c53d8e6d1e9.html
zpos 2008-09-10
  • 打赏
  • 举报
回复
哦,我的意思是在存储过程中执行函数返回的SQL,然后返回一个数据集。
cosio 2008-09-10
  • 打赏
  • 举报
回复
select c('a') from dual;
hyrongg 2008-09-10
  • 打赏
  • 举报
回复

SQL> create or replace function f1
2 return nvarchar2
3 is
4 begin
5 return 'select * from a';
6 end;
7 /

Function created

SQL>
SQL> create or replace procedure p1
2 as
3 strsql nvarchar2(200);
4 begin
5 select f1 into strsql from dual;
6 dbms_output.put_line(strsql);
7 end;
8 /

Procedure created

SQL> set serveroutput on;
SQL> exec p1;

select * from a

PL/SQL procedure successfully completed

SQL>
vc555 2008-09-10
  • 打赏
  • 举报
回复
declare
v_sql varchar2(1000);
begin
select 函数() into v_sql from dual;
end;
/
oracledbalgtu 2008-09-10
  • 打赏
  • 举报
回复

CREATE OR REPLACE FUNCTION get_sql(p_table VARCHAR2) RETURN VARCHAR2 IS
l_str VARCHAR2(1000);
BEGIN
l_str:='select ename from '||p_table;
RETURN l_str;
END;
/

CREATE OR REPLACE PROCEDURE proc_test(p_table VARCHAR2) IS
l_str VARCHAR2(1000);
BEGIN
l_str:=get_sql(p_table);
dbms_output.put_line(l_str);
END;
/

BEGIN
proc_test('scott.emp');
END;
/
[Quote=引用楼主 zpos 的帖子:]
我是个ORACLE初学者,我是FUNCTION中编写了一个函数,函数的功能是返回一个动态SQL语句,现在问题是怎样才能在存储过程中调用这个函数呢,有代码麻烦给参考下,谢谢。
[/Quote]
vc555 2008-09-10
  • 打赏
  • 举报
回复
你的sql_st怎么没看见定义呢?直接就用了。
zpos 2008-09-10
  • 打赏
  • 举报
回复
create or replace package body EXPORT_CLASS_SCORE is

Procedure getClassScore( stu_no in char, stu_term in char, return_list out outscore )
as
begin
sql_st:=list1(stu_no,stu_term);
open return_list for sql_st;
return return_list;
end getclassscore;

FUNCTION list1(tmp_stu IN CHAR,tmp_term IN CHAR)
RETURN VARCHAR2
IS
v_sumv VARCHAR2(4000);
BEGIN
v_sumv := 'select student_no,class_code,' ;
FOR cur IN (SELECT distinct curricula_code FROM compulsory_score WHERE student_no=tmp_stu and term = tmp_term) LOOP
v_sumv := v_sumv||'sum(decode(curricula_code,'''||cur.curricula_code||''',score)) "'|| cur.curricula_code|| '",';
END LOOP;
v_sumv := substr(v_sumv, 1, length(v_sumv)-1) ;
v_sumv :=v_sumv||' from compulsory_score where score_kind = ''F'' and student_no ='''||tmp_stu||''' group by student_no,class_code';
RETURN v_sumv;
END list1;
end EXPORT_CLASS_SCORE;


错误提示:
Compilation errors for PACKAGE BODY CAICHANG.EXPORT_CLASS_SCORE

Error: PLS-00103: 出现符号"SQL_ST"在需要下列之一时:
select
Line: 7
Text: open return_list for sql_st;

Error: PLS-00103: 出现符号"END"在需要下列之一时:
beginfunctionpackagepragma
procedureformexternal
Line: 26
Text: end EXPORT_CLASS_SCORE;


这是我的源代码,请帮忙分析下,谢谢
zpos 2008-09-10
  • 打赏
  • 举报
回复
我现在用的版本是8.0.5,好像不支持,出现open for错误,大家看看在这个版本下有没有其它的办法,谢谢

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧