簡體   English   中英

如何在 Informix 的 MERGE 語句中使用源參數?

[英]How do I use parameters for the source in a MERGE statement in Informix?

我正在嘗試對 Informix 數據庫執行合並語句,如下所示:

MERGE INTO aa_rec AS dest
USING (SELECT '123456' AS id, '111-222-3333' as phone, '' as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual) AS src
ON dest.id = src.id AND dest.aa = src.aa
WHEN NOT MATCHED THEN 
    INSERT (dest.id, dest.aa, dest.beg_date, dest.phone, dest.phone_ext, dest.ofc_add_by)
    VALUES (src.id, src.aa, TODAY, src.phone, src.phone_ext, 'TEST')
WHEN MATCHED THEN UPDATE SET 
        dest.phone = src.phone, 
        dest.phone_ext = src.phone_ext, 
        dest.beg_date = '10/29/2019', 
        dest.ofc_add_by = 'TEST'

此語句按原樣使用硬編碼值,但我想為源表中的值傳遞參數:

USING (SELECT ? AS id, ? as phone, ? as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual) AS src

當我使用參數和有效值執行語句時,我收到此錯誤:

E42000: (-201) 出現語法錯誤。

MERGE 語句的源代碼部分是否支持參數? 如果是,我的語法錯誤在哪里?

對於上下文,我使用 Informix 的 OleDb 提供程序從 ASP.NET 調用它。

你有:

SELECT ? AS id, ? as phone, ? as phone_ext, 'CELL' as aa FROM sysmaster:'informix'.sysdual

您不能對 SELECT 語句的“結構”元素使用占位符( ?符號)。 您不能在占位符中提供列名。 並且通過選擇列表中的占位符將數字等作為值傳遞也不起作用。

我可能會創建一個適當形狀的臨時表,並在其中插入一行,然后在 select 語句中使用臨時表:

SELECT '123456' AS id, '111-222-3333' AS phone, '' AS phone_ext, 'CELL' AS aa
  FROM sysmaster:'informix'.sysdual
  INTO TEMP phone_data;

MERGE INTO aa_rec AS dest
USING (SELECT * FROM phone_data) AS src
   ON dest.id = src.id AND dest.aa = src.aa
 WHEN NOT MATCHED THEN 
      INSERT (dest.id, dest.aa, dest.beg_date, dest.phone, dest.phone_ext, dest.ofc_add_by)
          VALUES (src.id, src.aa, TODAY, src.phone, src.phone_ext, 'TEST')
 WHEN MATCHED THEN UPDATE SET 
          dest.phone = src.phone, 
          dest.phone_ext = src.phone_ext, 
          dest.beg_date = '10/29/2019', 
          dest.ofc_add_by = 'TEST'
;

DROP TABLE phone_data;

顯式創建臨時表可能比使用 INTO TEMP 子句更好/更安全。 類型不一定是您所期望的(CHAR(6)、CHAR(12)、VARCHAR(1)、CHAR(4))——盡管這可能無關緊要。

顯然,一旦臨時表存在,您就可以使用任何可用的機制將任何適合的數據插入到臨時表中:

INSERT INTO phone_data(id, phone, phone_ext, aa) VALUES(?, ?, ?, ?)

請記住,臨時表是會話專用的——您可以讓很多人同時使用相同的臨時表名稱,而不會相互干擾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM