概要
Databricks において、Function 内で直接 UPDATE を実行する方法と、ストアドプロシージャ経由で UPDATE を実行する方法を試したところ、いずれもエラーとなりました。Function ではこのようなデータ更新操作を行うことは想定されていないようです。
事前準備
カタログとスキーマを作成
%sql
CREATE CATALOG IF NOT EXISTS func_test_01;
CREATE SCHEMA IF NOT EXISTS func_test_01.schema_01;
テーブルの準備
%sql
CREATE OR REPLACE TABLE func_test_01.schema_01.customer (
customer_id STRING,
customer_name STRING,
status STRING
);
%sql
INSERT INTO func_test_01.schema_01.customer
VALUES
('C001', 'Alice', 'ACTIVE');
検証
1. UDF 内で直接 UPDATE する方法
UDF の本体に UPDATE 文を記述したところ、エラーとなりました。
%sql
-- ★ UDF 内で直接 UPDATE できるかを確認
CREATE OR REPLACE FUNCTION
func_test_01.schema_01.deactivate_customer_direct(
p_customer_id STRING
)
RETURNS STRING
LANGUAGE SQL
RETURN (
UPDATE func_test_01.schema_01.customer
SET status = 'INACTIVE'
WHERE customer_id = p_customer_id
);
[PARSE_SYNTAX_ERROR] Syntax error at or near '.'. SQLSTATE: 42601
2. Function 内でストアドプロシージャを呼び出す方法
まず、ストアドプロシージャを定義し、単体で正常に動作することを確認しました。
%sql
CREATE OR REPLACE PROCEDURE
func_test_01.schema_01.deactivate_customer_proc(
IN p_customer_id STRING
)
LANGUAGE SQL
SQL SECURITY INVOKER
MODIFIES SQL DATA
AS
BEGIN
UPDATE func_test_01.schema_01.customer
SET status = 'INACTIVE'
WHERE customer_id = p_customer_id;
END;
CALL func_test_01.schema_01.deactivate_customer_proc('C001');
-- 値を戻す
UPDATE func_test_01.schema_01.customer
SET status = 'ACTIVE'
WHERE customer_id = 'C001';
続いて、このストアドプロシージャを呼び出す Function を定義しようとしたところ、エラーとなりました。
%sql
-- ★ この CREATE FUNCTION がエラーになるかを確認
CREATE OR REPLACE FUNCTION
func_test_01.schema_01.deactivate_customer(
p_customer_id STRING
)
RETURNS STRING
LANGUAGE SQL
RETURN (
CALL deactivate_customer_proc(
p_customer_id
)
);
[PARSE_SYNTAX_ERROR] Syntax error at or near '('. SQLSTATE: 42601




