0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ベクトルDBを構築するためのSnowflakeオブジェクトのmdファイル作成クエリ

0
Last updated at Posted at 2026-03-18

起点

Bedrockのナレッジベースのデータソースとして、Snowflakeのオブジェクト情報を使いたいなと考えました。

イメージの構想

①Snowflakeの各オブジェクト情報をMarkdown形式の文字列としてプロシージャで生成
②①のクエリをLambdaでS3に.mdファイルとして書き出す。

今回は、その①のストアドプロシージャを構築してみました。

ストアドプロシージャ


CREATE OR REPLACE PROCEDURE COLLECT_OBJECT_DOCS_MD(schema_name VARCHAR)
RETURNS VARIANT
LANGUAGE SQL
AS
$$
DECLARE
    obj_list    RESULTSET;
    col_list    RESULTSET;
    ddl_cur     CURSOR FOR SELECT ddl_text FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()));
    db          VARCHAR;
    scm         VARCHAR;
    tbl         VARCHAR;
    ttype       VARCHAR;
    obj_comment VARCHAR;
    ddl         VARCHAR;
    obj_type    VARCHAR;
    col_table   VARCHAR;
    col_row     VARCHAR;
    markdown    VARCHAR;
    results     ARRAY := ARRAY_CONSTRUCT();
BEGIN
    obj_list := (EXECUTE IMMEDIATE
        'SELECT table_catalog, table_schema, table_name, table_type, comment
         FROM INFORMATION_SCHEMA.TABLES
         WHERE table_schema = ''' || schema_name || '''
           AND table_type IN (''BASE TABLE'', ''VIEW'')');

    FOR rec IN obj_list DO
        db          := rec.table_catalog;
        scm         := rec.table_schema;
        tbl         := rec.table_name;
        ttype       := rec.table_type;
        obj_comment := COALESCE(rec.comment, '(説明なし)');
        obj_type    := CASE ttype WHEN 'VIEW' THEN 'VIEW' ELSE 'TABLE' END;

        -- カラム一覧をMarkdownテーブルとして組み立て
        col_table := '| カラム名 | データ型 | NULL許可 | デフォルト値 | 説明 |' || '\n' ||
                     '|---|---|---|---|---|' || '\n';

        col_list := (EXECUTE IMMEDIATE
            'SELECT column_name, data_type, is_nullable, column_default, comment
             FROM INFORMATION_SCHEMA.COLUMNS
             WHERE table_schema = ''' || scm || '''
               AND table_name   = ''' || tbl || '''
             ORDER BY ordinal_position');

        FOR col IN col_list DO
            col_row := '| ' || col.column_name                          ||
                       ' | ' || col.data_type                           ||
                       ' | ' || col.is_nullable                         ||
                       ' | ' || COALESCE(col.column_default, '―')      ||
                       ' | ' || COALESCE(col.comment, '―')             ||
                       ' |' || '\n';
            col_table := col_table || col_row;
        END FOR;

        -- DDL取得
        EXECUTE IMMEDIATE
            'SELECT GET_DDL(''' || obj_type || ''', ''' || db || '.' || scm || '.' || tbl || ''', TRUE) AS ddl_text';
        OPEN ddl_cur;
        FETCH ddl_cur INTO ddl;
        CLOSE ddl_cur;

        -- Markdownドキュメントとして組み立て
        markdown :=
            '# ' || tbl || '\n\n' ||
            '## 基本情報\n\n' ||
            '- **データベース**: ' || db          || '\n' ||
            '- **スキーマ**: '     || scm         || '\n' ||
            '- **オブジェクト種別**: ' || ttype   || '\n' ||
            '- **説明**: '         || obj_comment || '\n\n' ||
            '## カラム一覧\n\n' ||
            col_table || '\n' ||
            '## DDL\n\n' ||
            '```sql\n' || ddl || '\n```\n';

        results := ARRAY_APPEND(results, OBJECT_CONSTRUCT(
            's3_key',   db || '/' || scm || '/' || tbl || '.md',
            'content',  markdown
        ));
    END FOR;

    RETURN results::VARIANT;
END;
$$;


-- 実行
CALL COLLECT_OBJECT_DOCS_MD('LAKE');

-- 内容確認(オブジェクトごとに展開)
SELECT
    value:s3_key::VARCHAR  AS s3_key,
    value:content::VARCHAR AS markdown_content
FROM TABLE(FLATTEN(INPUT => (
    SELECT $1 FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
)));

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?