sql >> データベース >  >> RDS >> PostgreSQL

byteaからoidへのキャストを理解する

    キャストは本当のキャストではありません。便利な構文を(ab)使用しているだけです。 ラージオブジェクト(LO) 個別に保存されているバックグラウンドで作成され、それを参照するOIDが返されます。

    ドキュメントごと:

    返されるOIDは、基本的にシステムテーブルのPKへのFKです pg_largeobject

    CREATE TABLE 機能や疑似キャストから完全に独立しています。

    CREATE TABLE bytea_to_lo (
       largeObj lo 
    );
    

    これは、上記で作成した割り当てキャストの典型的な使用例であり、引用するのを忘れた次の行から明らかになります。

    INSERT INTO bytea_to_lo VALUES (DECODE('00AB','hex'));
    

    ここで何が起こりますか?

    データ型lo 基本タイプoid上のドメインです 、追加モジュール loによって作成されます GraceBatumbyaのブログエンティティ )。 ドキュメントごと:

    関数 decode() byteaを返します 。 INSERT ステートメントはbyteaを割り当てます 列largeObjの値 、タイプloへの割り当てキャストをトリガーします 、そしてそれが上記のキャストの出番です。

    警告/修正/更新

    ブログエントリはずさんで、今では時代遅れです。

    • わざわざ言及しないでください(ドキュメントごと ):

      事実上、あなたはスーパーユーザーでなければなりません。

    • CREATE TABLEのタイプミス :列名とタイプが逆になっています。

    • 関数の定義は冗長で非効率的です。これはより良いでしょう(Postgres 9.3 の場合) 以上):

      CREATE OR REPLACE FUNCTION blob_write(bytea)
        RETURNS oid AS
      $func$
      DECLARE
         loid oid := lo_create(0);
         lfd  int := lo_open(loid,131072);  -- = 2^17 = x2000
         -- symbolic constant defined in the header file libpq/libpq-fs.h
         -- #define   INV_WRITE   0x00020000
      BEGIN
         PERFORM lowrite(lfd, $1);
         PERFORM lo_close(lfd);
         RETURN loid;
      END
      $func$  LANGUAGE plpgsql VOLATILE STRICT;
      

      SQLフィドル。

    ビルトインがあります機能 これについてはPostgres9.4 。代わりにそれを使用してください:

    lo_from_bytea(loid oid, string bytea)
    

    リリースノート から :

    CREATE CASTの場合 (ドキュメントごと ):

    byteaのみのオーバーロードされたバリアントをお勧めします パラメータ:

    CREATE OR REPLACE FUNCTION lo_from_bytea(bytea)
       RETURNS oid LANGUAGE sql AS
    'SELECT lo_from_bytea(0, $1)';
    
    CREATE CAST (bytea AS oid) WITH FUNCTION lo_from_bytea(bytea) AS ASSIGNMENT;
    

    疑似キャストにはかなり大きな副作用があるので、それをASSIGNMENTにすることは確信できません。 キャスト。私はおそらく明示的のみから始めるでしょう:




    1. ExcelからMySqlデータベーステーブルにデータを移行するためのステップバイステップの手順

    2. MySQLで変数をデクリメントすることは可能ですか?

    3. intをfloatに変更します(mysql)

    4. plpgsql変数を使用してn_distinctを設定するときにエラーが発生しました