在oracle Pl-Sql函数中传递参数的问题

时间:2016-05-20 05:14:06

标签: oracle plsql

我写了一个函数funGetAccount’ in Oracle Pl-Sql`传递参数ProdCd但查询已经考虑了它的语句如何解决我不明白我的req是同样的查询请不要改变查询设计。

Function  funGetAccount (ProdCd in Number)
          Return Varchar2 Is
          varResult       Varchar2(2000);

          Begin

          varResult :=  ' Select AC_NO, NAME From ('
                     || ' Select AC_NO, NAME'
                     || ' From Tab1 Where PRODUCT_CD = ProdCd)';


         varResult := varResult;
         Return varResult;
End funGetAccount;

4 个答案:

答案 0 :(得分:1)

这将返回空格连接的AC_NONAME。您无法从中返回2个值。

同时确保您的查询仅为给定的prodcd返回1行,否则它只返回第一行。

create or replace function funGetAccount (ProdCd in Number)
          Return Varchar2 Is
          varResult Varchar2(2000);
          Begin
  Select AC_NO||' '||NAME 
             into varResult
             From Tab1 Where PRODUCT_CD = ProdCd and rownum <2;
       Return varResult;
End funGetAccount;

答案 1 :(得分:0)

我不明白你想用这个函数存档什么:return select语句或检索数据。

在第一种情况下你应该这样做:

Function  funGetAccount (ProdCd in Number)
Return Varchar2 
Is
    varResult       Varchar2(2000);
Begin
     varResult :=  ' Select AC_NO, NAME From ('
                   || ' Select AC_NO, NAME'
                   || ' From Tab1 ' 
                   || ' Where PRODUCT_CD = ' || ProdCd || ')';

    Return varResult;
End funGetAccount;

在第二个(检索数据)

create or replace function funGetAccount (ProdCd in Number)
Return Varchar2 
Is
    varResult Varchar2(2000);
Begin
    Select AC_NO||' '||NAME 
    into varResult
    From Tab1 
    Where PRODUCT_CD = ProdCd;

    Return varResult;

End funGetAccount;

答案 2 :(得分:0)

根据我可以看到的问题,有两个要求可以出现。

1)OP希望通过FUNCTION返回原始SQL语句。

2)OP希望以CONCATENATED WAY方式输出SQL。

我专注于2点,我已经结合了一些优秀的编码实践,如EXCEPTION Handling。希望它有所帮助。

FUNCTION funGetAccount(
    ProdCd IN NUMBER)
  RETURN VARCHAR2
IS
  p_result_out VARCHAR2(100);
  varResult    VARCHAR2(2000);
BEGIN
  varResult := 'Select AC_NO||'',''||NAME From                 
              ( Select AC_NO, NAME  From Tab1 Where PRODUCT_CD = '''||ProdCd||''')';
  BEGIN --> Exception handling missed
    EXECUTE IMMEDIATE varResult INTO p_result_out;
  EXCEPTION
  WHEN OTHERS THEN --> Others is broad term you can catch specific exceptions like no data found too many rows etc
    NULL;          -- Your action logic
  END;
  RETURN p_result_out;
END funGetAccount;

答案 3 :(得分:0)

Function  funGetAccount (ProdCd in Number)
          Return Varchar2 Is
          varResult       Varchar2(2000);

          Begin

          varResult :=  ' Select AC_NO, NAME From ('
                     || ' Select AC_NO, NAME'
                     || ' From Tab1 Where PRODUCT_CD = '''|| ProdCd ||''')';


         varResult := varResult;
         Return varResult;
End funGetAccount;