2016-07-21 3 views
0
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') 

Я получаю сообщение об ошибке, что значение моего массива должно начинаться с "{". Мой массив, который я пытаюсь создать, представляет из вида v_data_type вид состоит только из одного столбца с типом varchar.Postgresql: Значение массива должно начинаться с "{" или информации об измерении

Может ли кто-нибудь направить меня туда, где проблема в моем коде?

Спасибо заранее

ответ

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) || '), но я мог ошибаться.

Я предполагаю, что ваша ошибка типа исходит из этой второй задачи, но похоже, что вам нужно пересмотреть, что различные переменные в этой функции предназначены для. Удачи.