2

データベースでインラインクエリを実行しようとしています-citext拡張機能がインストールされています(を使用CREATE EXTENSION)-それでも、実行されたクエリは関数を呼び出すときにこのエラーをスローし続けます:

type "citext" does not exist 
DO
LANGUAGE plpgsql
$$
DECLARE
  _id INT;
BEGIN
  SELECT * FROM "dbo"."MyFunction"(_id, 'some value'::citext);
END;
$$;

::citextキャストを省略すると、次のようになります。

function dbo.MyFunction(integer, unknown) does not exist.
You might need to add explicit type casts.

拡張機能が追加され、スキーマのcitext一部となり、他のクエリと連携します。これはランダムに発生し続けます - 何が原因ですか?

編集: インストールされている拡張機能:

extname   | nspname
----------+-----------
plpgsql   | pg_catalog
citext    | public
uuid-ossp | public

検索パス:

show search_path;
search_path
-----------
dbo
4

1 に答える 1

2

疑わしいように、拡張スキーマが にありませんsearch_path。この関連する回答でスキーマ検索パスを設定する方法を読んでください。

クライアント search_path = dboが接続を設定しているようですが、設定が間違っているようです。dboは、SQL Server でよく見られるものであり (以前はここでデフォルトのスキーマだったのか、それとも今もそうなのでしょうか?)、Postgres では非常に一般的ではありません。どうやってそこにたどり着いたのかわからない。

別の方法として、拡張機能をdboスキーマにインストールすることもできます。

(ほとんどの) 拡張機能を別のスキーマに移動することもできます:

ALTER EXTENSION citext SET SCHEMA dbo;

ただし、拡張機能を専用のスキーマにインストールして、.xml ファイルに含めることをお勧めしますsearch_path

とにかく放置plpgsql。これはデフォルトでインストールされており、そのままにしておく必要がありますpg_catalog

いずれにせよ、さまざまな設定で混乱を一掃しsearch_pathます。


2 番目の質問については、 Function Type Resolutionの規則に従っています。citextへの暗黙的なキャストがないため、呼び出しを解決できませんtext

関連している

于 2016-09-01T02:46:57.297 に答える