我创建了一个类型:
CREATE OR REPLACE TYPE NAGULIVE.DEPOSIT_DATA_TYPE AS OBJECT (
DEPOSIT_NO VARCHAR2 (16 Byte),
ACCT_NAME VARCHAR2 (128 Byte),
DEPOSIT_DT DATE,
EPOSIT_AMT NUMBER (16,2)
);
如果我执行该功能,它将显示错误。我不知道我哪里错了。
CREATE OR REPLACE FUNCTION NAGULIVE.GET_DEPOSIT_DETAIL (IN_F_DATE DATE,IN_T_DATE DATE)
RETURN(NAGULIVE.DEPOSIT_DATA_TYPE) AS
BEGIN
RETURN QUERY(SELECT D.DEPOSIT_NO, ACCT_NAME, DEPOSIT_DT, DEPOSIT_AMT
FROM DEPOSIT_ACINFO D
INNER JOIN ACT_MASTER A ON D.CUST_ID=A.CUST_ID
INNER JOIN DEPOSIT_SUB_ACINFO DS ON D.DEPOSIT_NO=DS.DEPOSIT_NO WHERE DS.DEPOSIT_DT>=IN_F_DATE AND DS.DEPOSIT_DT<=IN_F_DATE);
END;
/
错误是
2/7 PLS-00103: Encountered the symbol "(" when expecting one of the following:
<an identifier> <a double-quoted delimited-identifier> self
long double ref char time timestamp interval date binary
national character nchar
4/1 PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following:
<an identifier> <a double-quoted delimited-identifier>
答案 0 :(得分:2)
尽管你对PL/SQL
的了解很少,但我怀疑你是否自己编码了上述所有内容。错误消息指的是不存在的函数QUERY
。
CREATE OR REPLACE FUNCTION NAGULIVE.GET_DEPOSIT_DETAIL (IN_F_DATE DATE,IN_T_DATE DATE)
RETURN(NAGULIVE.DEPOSIT_DATA_TYPE) AS
BEGIN
RETURN QUERY(SELECT D.DEPOSIT_NO, ACCT_NAME, DEPOSIT_DT, DEPOSIT_AMT
^^^^^
FROM DEPOSIT_ACINFO D
INNER JOIN ACT_MASTER A ON D.CUST_ID=A.CUST_ID
INNER JOIN DEPOSIT_SUB_ACINFO DS ON D.DEPOSIT_NO=DS.DEPOSIT_NO WHERE DS.DEPOSIT_DT>=IN_F_DATE AND DS.DEPOSIT_DT<=IN_F_DATE);
END;
/
左括号表示您要将参数传递给函数,但没有名为SELECT
等的变量。这当然看起来像SELECT
语句。您在评论中提到Postgres
。我对postgres一无所知,但如果你能在postgres中做到这一点,我可以证明你在Oracle PL/SQL
中没有这样的东西。
我想这一切并没有带给你更多但是我必须同意a_horse_with_no_name你必须从第一个方面开始并开始学习PL/SQL
。
答案 1 :(得分:1)
create or replace function nagulive.get_deposit_detail(
in_f_date date,
in_t_date date
) return deposit_data_type
as
v_deposit_data deposit_data_type;
begin
select deposit_data_type(d.deposit_no, acct_name, deposit_dt, deposit_amt)
into v_deposit_data
from deposit_acinfo d
inner join act_master a on d.cust_id=a.cust_id
inner join deposit_sub_acinfo ds on d.deposit_no=ds.deposit_no
where ds.deposit_dt>=in_f_date
and ds.deposit_dt<=in_f_date;
return v_deposit_data;
end;
/
虽然SQL和PL / SQL很好地协同工作,但它们并不是完全无缝的。与PostgreSQL不同,SQL语句不能用作本机PL / SQL表达式。相反,必须声明一个变量,该语句必须SELECT INTO该变量,然后返回该变量。
返回声明也存在一个小的语法问题 - 返回类型周围不应该有括号。这与return语句不同,后者可选择允许使用括号。
这些对我来说都是可以理解的错误,我不确定为什么这个问题会引起如此多的仇恨。