我写了一个函数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;
答案 0 :(得分:1)
这将返回空格连接的AC_NO
和NAME
。您无法从中返回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;