create or replace
FUNCTION JDT_UDC_Desc
(
V_SY IN VARCHAR2,
V_RT IN VARCHAR2,
V_KY IN VARCHAR2
)
RETURN VARCHAR2
AS
V_DL01 VARCHAR2(30);
BEGIN
EXECUTE IMMEDIATE 'select drdl01
from PRODCTL.F0005
WHERE DRSY = V_SY
AND DRRT = V_RT
AND ltrim(rtrim(drky)) =ltrim(rtrim(V_KY))'
INTO V_DL01
using V_SY,V_RT,V_KY;
END;
汇编。我点击运行并输入以下值:
V_SY ='00',
V_RT = '01',
V_KY='04';
我得到以下错误
ORA-00904 V_KY标识符无效
有谁能帮我理解这个错误的原因?
答案 0 :(得分:2)
您在语句中传递文字值'V_SY','V_RT'和'V_KY',并将它们解释为列名,因此无效标识符错误。您需要使用变量占位符,如:
EXECUTE IMMEDIATE 'select drdl01
from PRODCTL.F0005
WHERE DRSY = :1
AND DRRT = :2
AND ltrim(rtrim(drky)) =ltrim(rtrim(:3))'
INTO V_DL01
using V_SY,V_RT,V_KY;
答案 1 :(得分:1)
首先,似乎没有任何理由在这里使用动态SQL。您需要求助于动态SQL应该是很少见的 - 您的代码将更高效,更易于维护。
create or replace
FUNCTION JDT_UDC_Desc
(
V_SY IN VARCHAR2,
V_RT IN VARCHAR2,
V_KY IN VARCHAR2
)
RETURN VARCHAR2
AS
V_DL01 VARCHAR2(30);
BEGIN
select drdl01
into V_DL01
from PRODCTL.F0005
WHERE DRSY = V_SY
AND DRRT = V_RT
AND trim(drky) =trim(V_KY);
return v_dl01;
END;
其次,如果为列和表选择有意义的变量名和有意义的名称,那将非常有用。 F0005
不会告诉您表中包含的内容。 v_sy
和drsy
不会告诉您变量或列应包含的内容。这将使维护此代码变得更加困难。