У меня есть скрипт, и я попытался заставить работать пользовательскую функцию. Это возможно?
Очень часто задаваемый вопрос: как сделать таблицу из другой функции схемы в Postgres? что ORACLE называет MERGE INTO ... USING
и стандарт поддерживает как часть операции MERGE в Postgres, но каким-то образом PostgreSQL не поддерживает его и / или не распознает переменную. как бы ты это сделал? Учтите следующее:
CREATE OR REPLACE FUNCTION "CIDR_STAGING"."PR_MIG_STG_DATE_IN" (
v_Ret OUT int ) RETURNS integer
as $$
declare
v_ErrorCode int;
v_ErrorMsg varchar(512);
v_Module varchar(32) = 'PR_MIG_STG_DATE_IN';
begin
----
-- MERGING: STG_DATE_IN into SC_DATE_IN
----
MERGE INTO cidrdba.sc_date_in prod
USING (
SELECT Receipt_Number,date_in, mig_filename,mig_insert_dt,mig_modified_dt
FROM cidr_staging.STG_Date_In
ORDER by mig_seq
) AS stg
ON ( prod.receipt_number = stg.receipt_number )
WHEN MATCHED THEN UPDATE SET
-- prod.Receipt_Number = stg.Receipt_Number,
prod.Date_In = stg.Date_In,
prod.mig_filename = stg.mig_filename,
--prod.mig_insert_dt = stg.mig_insert_dt,
--prod.mig_modified_dt = stg.mig_modified_dt
prod.mig_modified_dt = current_timestamp
WHEN NOT MATCHED THEN INSERT
(
prod.Receipt_Number,
prod.Date_In,
prod.mig_filename,
prod.mig_insert_dt,
prod.mig_modified_dt
) SELECT (
stg.Receipt_Number,
stg.Date_In,
stg.mig_filename,
current_timestamp,
--stg.mig_insert_dt,
null
--stg.mig_modified_dt
)
;
----
-- Set the return code to 0
----
v_Ret := SQLCODE;
----
-- Exception error handler
----
exception
when others then
v_ErrorCode := SQLCODE;
v_ErrorMsg := SQLERRM;
v_Ret := v_ErrorCode;
----
-- Commit the record into the ErrorLog
----
PERFORM pr_write_error_log( sys_context('userenv','session_user'),
sys_context('userenv','host'), v_Module,
v_ErrorCode, v_ErrorMsg );
----
-- Intentionally leaving the "commit" to application
----
end;
$$ LANGUAGE plpgsql;
ОШИБКА: "cidrdba.sc_date_in" не известная переменная
ЛИНИЯ 14: MERGE INTO cidrdba.sc_date_in prod
^
Состояние SQL: 42601
Персонаж: 347
V / R,
Бах Нга