我是个ORACLE初学者,我是FUNCTION中编写了一个函数,函数的功能是返回一个动态SQL语句,现在问题是怎样才能在存储过程中调用这个函数呢,有代码麻烦给参考下,谢谢。

解决方案 »

  1.   


    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;
    /
      

  2.   

    declare
    v_sql varchar2(1000);
    begin
    select 函数() into v_sql from dual;
    end;
    /
      

  3.   


    SQL> create or replace function f1
      2  return  nvarchar2
      3  is
      4  begin
      5    return 'select * from a';
      6  end;
      7  /Function createdSQL> 
    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 createdSQL> set serveroutput on;
    SQL> exec p1;select * from aPL/SQL procedure successfully completedSQL> 
      

  4.   

    select c('a') from dual;
      

  5.   

    哦,我的意思是在存储过程中执行函数返回的SQL,然后返回一个数据集。
      

  6.   

    http://topic.csdn.net/u/20080905/11/86bb6a5a-e747-4cb9-bb32-7c53d8e6d1e9.html
      

  7.   


    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
      

  8.   

    先自定义一个游标tcursor
    再存储过程中定义变量参数加上cur out tcursor,然后open cur for SQL语句
      

  9.   

    我现在用的版本是8.0.5,好像不支持,出现open for错误,大家看看在这个版本下有没有其它的办法,谢谢
      

  10.   

    create or replace package body EXPORT_CLASS_SCORE isProcedure 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_SCOREError: 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;
    这是我的源代码,请帮忙分析下,谢谢
      

  11.   

    你的sql_st怎么没看见定义呢?直接就用了。