時,我有以下代碼:ORA-14551插入GTT
CREATE OR REPLACE FUNCTION repeatable_rand_text(ftype IN VARCHAR2
, in_val IN VARCHAR2)
RETURN VARCHAR2 IS
workval VARCHAR2(64);
insert_needed BOOLEAN := FALSE;
BEGIN
BEGIN
SELECT new_name
INTO workval
FROM ps_dt_mixnames_preserve
WHERE name_type = ftype AND old_name = in_val;
EXCEPTION
WHEN NO_DATA_FOUND THEN
workval := rand_text(ftype);
insert_needed := TRUE;
END;
IF insert_needed THEN
INSERT INTO ps_dt_mixnames_preserve(name_type, old_name, new_name)
VALUES (ftype, in_val, workval);
END IF;
RETURN workval;
END repeatable_rand_text;
這個程序的目的,是在一個數據庫中,以掩蓋名稱作爲準備創建一個生產發展數據庫的一部分。
我們要掩蓋的名字,但我們希望他們是可重複的,這樣我們的結果是這樣的:(左側輸入;右邊輸出)
JOHN JONES -> STEEL POTATO
SAM JONES -> LARGE POTATO
MARY JONES -> WHITE POTATO
SUE SMITH -> LARGE CARROT
FRED JONES -> RED POTATO
JOHN SMITH -> GREEN CARROT
你可能得到的想法:姓氏被更改爲隨機值,但在再次遇到時重複。鑑於名字只是隨機的。在這裏,這是一個令人擔憂的姓氏。
對於我們來說,數組和其他非永久性解決方案不會很好,因爲這實際上將作爲在同一會話中執行的大量UPDATE語句來執行。 GTT似乎非常適合這種類型的事情。
最終,我們會想執行類似的更新:
UPDATE MY_TABLE
SET ORIG_NAME = repeatable_rand_text('last', ORIG_NAME)
但爲了「證明這個程序的結果,我們執行下列SQL:
SELECT ORIG_NAME, repeatable_rand_text('last',ORIG_NAME)
FROM MY_TABLE
現在,很明顯,該函數中的INSERT將作爲SELECT的結果執行,這是一個不允許的(並且,如果不能這樣做,我們就不願意嘗試自然而然地發生的UPDATE。儘管我們知道,它可能會失敗並帶有類似的信息。)問題是,圍繞這種情況有沒有合理的方法?
謝謝,這是一個有趣的方法;我喜歡。要回答你的問題,不要; rand_text('first')將返回形容詞(「Obstinate」),而rand_text('last')將返回名詞(「Pepper」)。但我可以看到你爲什麼想不到。再次感謝。 – Dennis
啊,是的,重新理解這個問題是有道理的。一行'rand_text()'我測試了這個沒有* 8-) –