我試圖運行表Person
一個UPSERT這樣的:如何在匿名PL/SQL塊中使用重複佔位符名稱?
BEGIN
EXECUTE IMMEDIATE q'[
MERGE INTO Person p
USING (SELECT :x id, :y first_name, :z last_name FROM Dual) data
ON (p.id = :x) -- note the repeated placeholder :x here
WHEN MATCHED THEN
UPDATE SET p.first_name = data.first_name, p.last_name = data.last_name
WHEN NOT MATCHED THEN
INSERT (id, first_name, last_name) VALUES (data.id, data.first_name, data.last_name)
]' USING 123, 'Foo', 'Bar';
END;
/
如果我運行代碼上面給出,甲骨文拋出一個ORA-01008: not all variables bound ORA-06512: at line 2
按照docs,這是不應該發生在這一點(在匿名塊內)。我究竟做錯了什麼?
我知道我可以解決這個問題,如果我提供四個參數… USING 123, 'Foo', 'Bar', 123;
,這工作得很好,但顯然我不想重複自己。編輯:正如答案中指出的那樣,ON (p.id = data.id)
是另一種可能的解決方法。
問題不在於如何解決這個問題,更多的是在這種情況下了解造成這種錯誤的原因。
您的評論是指'佔位符:1';你真的使用位置或命名綁定變量? (這個例子有多麼人爲 - 你爲什麼不做'ON(p.id = data.id)'?) –
@AlexPoole我修復了評論。我試過':1,:2,:3'和':x,:y,:z',都會產生相同的錯誤。 – user123444555621