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?

Databricks の SQL Function 内では UPDATE もストアドプロシージャ呼び出しもできない仕様の確認

0
Posted at

概要

Databricks において、Function 内で直接 UPDATE を実行する方法と、ストアドプロシージャ経由で UPDATE を実行する方法を試したところ、いずれもエラーとなりました。Function ではこのようなデータ更新操作を行うことは想定されていないようです。

image.png

image.png

事前準備

カタログとスキーマを作成

%sql
CREATE CATALOG IF NOT EXISTS func_test_01;
CREATE SCHEMA IF NOT EXISTS func_test_01.schema_01;

image.png

テーブルの準備

%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');

image.png

検証

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

image.png

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';

image.png

続いて、このストアドプロシージャを呼び出す 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

image.png

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?