通過 ODBC (DBLINK) 連接時 Postgres 中的標識符大於 Oracle 限制的問題
我們有一個通過 psqlODBC 驅動程序從 Oracle 12.1 到 Postgres 的數據庫連結。當 Postgres 標識符(例如列名的長度超過30 個字元)時執行少數查詢/語句時會出現問題,這是直到 Oracle 12.1 為止的列名的最大限制。
ORA-04052:查找遠端對象時發生錯誤 myschema.mytesttable@ORA_TO_PGLINK ORA-01948:標識符的名稱長度 (32) 超過最大值 (30) ORA-06512:在第 13 行 04052.00000 -“查找遠端對象時發生錯誤%s%s%s%s%s" *原因:嘗試查找遠端對象時出錯。*行動:修復錯誤。確保遠端數據庫系統已執行 CATRPC.SQL 以創建用於查詢或查找儲存在數據庫中的對象的必要視圖。
即使該語句未明確引用該列,也會發生此錯誤。我們使用的語句基本上通過PL/SQL上的更新語句來更新另一個具有正常長度(<= 30 個字元)的列。
BEGIN UPDATE "mytesttable"@ORA_TO_PGLINK SET "col" = 10 WHERE "col" = 1; END;
這裡
col
不是 Postgres 中長度大於 30 個字元的那個。此外,該語句在作為普通 SQL 語句執行時執行**良好,即。**沒有匿名塊或在過程中。現在,我們當然可以通過將Postgres 中的列名*重命名為長度 <= 30 個字元來解決這個問題。*但是,我們不想這樣做,因為它還有其他幾個依賴項。就 Oracle db 而言,更新是 PL/SQL 過程的一部分,不能直接作為單個語句執行。解決方案是什麼?是否有解決方法或修改驅動程序的某些設置?
在 Postgres 數據庫中創建一個視圖,為相關列分配較短的名稱可能是一種選擇。它不會影響 Postgres 端的依賴關係,同時為 Oracle 提供舒適的短列名。
您應該在 Postgres 數據庫上編寫一個過程,該過程將您要更改的列和行作為參數,並從 Oracle 數據庫中呼叫它。
在甲骨文方面
IF vOperation = 'UPDATE' THEN UPDATE_MYTESTTABLE(10,1)@ORA_TO_PGLINK; END IF;
在 Postgres 方面,類似
PROCEDURE UPDATE_MYTESTTABLE(col1_in NUMBER, col2_in NUMBER) IS BEGIN UPDATE mytesttable SET "col" = col1_in WHERE "col" = col2_in; END UPDATE_MYTESTTABLE;
快速瀏覽一下,您應該檢查 Postgres 語法,它不是 PL/SQL。