起点
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()))
)));