Postgresql

通過 ODBC (DBLINK) 連接時 Postgres 中的標識符大於 Oracle 限制的問題

  • April 25, 2019

我們有一個通過 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。

引用自:https://dba.stackexchange.com/questions/236694