Postgresql:数组值必须以" {"或维度信息

时间:2016-07-21 16:58:54

标签: arrays postgresql

CREATE OR REPLACE FUNCTION f_old_transactions (IN p_fromdate date, IN p_todate date, IN p_transtype varchar,IN OUT p_cancelled boolean,
OUT p_transaction_date date,
OUT p_type varchar,
OUT p_description varchar,
OUT p_amount numeric)


RETURNS SETOF record AS
$BODY$

declare lRunQuery text; 
declare lTotalRec record;
declare lBranchList text[]; 
declare lTranstype text[]; 


BEGIN

select into lTranstype
    dt.type

from
    v_data_types dt;


    lTranstype := regexp_split_to_array(p_transtype, ',');

lrunquery := 'select
it.transaction_date trandate,
dt.type,
it.description,
ita.amount,
it.cancelled


from 
import_transaction it
inner join import_transaction_account ita on it.import_transaction_id=ita.import_transaction_id



where
it.transaction_date >= ' || quote_literal(p_fromdate) || '
and it.transaction_date <= ' || quote_literal(p_todate) || '
and dt.type = any(' || quote_literall(p_transtype) || ') and';

if (p_cancelled = TRUE) then
lrunquery := lrunquery || '
it.cancelled = ' || quote_literal(p_cancelled) || '';
else
lrunquery := lrunquery || '
it.cancelled = ' || quote_literal(p_cancelled) || '';
end if;



FOR lTotalrec in
    execute lRunQuery


LOOP
p_transaction_date := ltotalrec.trandate;
p_type :=ltotalrec.type;
p_description :=ltotalrec.description;
p_amount :=ltotalrec.amount;
p_cancelled := ltotalrec.cancelled;
return next;
END LOOP;

return ;
end;


$BODY$
LANGUAGE plpgsql IMMUTABLE
COST 100
ROWS 1000;
ALTER FUNCTION  f_old_transactions(date,date,varchar,boolean) OWNER TO "CompuLoanPostgres";

select * from f_old_transactions ('01-Jan-2010','31-Dec-2018','Receipt Cash','FALSE')

我收到的错误是我的数组值必须以&#34; {&#34;开头。我尝试创建的数组来自视图 v_data_type ,该视图只包含一个varchar类型的列。

有人可以指导我在我的代码中出现问题吗?

提前谢谢

1 个答案:

答案 0 :(得分:0)

我不认为你给了我们足够的信息来确定出了什么问题。值得注意的是,我不知道表格应该是什么样子,无论是在架构还是内容中。没有它,我无法在自己的数据库中构建测试用例来进行调试。

那就是说,我注意到了一些事情,特别是lTranstype变量:

  1. 您已经两次分配lTranstype。首先你SELECT INTO,然后立即将它分配给从p_transtype参数解压缩的值。我不清楚你在那个变量中想要什么。

  2. 稍后构建查询时,请添加and dt.type = any(' || quote_literall(p_transtype) || ')。问题是p_transtype是一个varchar参数,你试图像数组一样访问它。我怀疑你想要阅读and dt.type = any(' || quote_literall(lTranstype) || '),但我可能会弄错。

  3. 我猜测您的类型错误来自第二个问题,但似乎您需要重新评估此函数中的不同变量的用途。祝你好运。