CREATE PROCEDURE (membuat prosedur)

Berlaku untuk:ditandai dengan tanda centang (ya) Databricks SQL Databricks Runtime 17.0 ke atas ditandai dengan tanda centang (ya) Unity Catalog saja

Membuat prosedur di Unity Catalog yang mengambil atau memodifikasi argumen, menjalankan serangkaian pernyataan SQL, dan secara opsional mengembalikan kumpulan hasil.

Sintaksis

CREATE [OR REPLACE] PROCEDURE [IF NOT EXISTS]
    procedure_name ( [ procedure_parameter [, ...] ] )
    [ characteristic [...] ]
    AS compound_statement

procedure_parameter
    [ IN | OUT | INOUT ] parameter_name data_type
    [ DEFAULT default_expression ] [ COMMENT parameter_comment ]

characteristic
  { LANGUAGE SQL |
    SQL SECURITY { INVOKER | DEFINER } |
    NOT DETERMINISTIC |
    COMMENT procedure_comment |
    DEFAULT COLLATION default_collation_name |
    MODIFIES SQL DATA }

Parameter-parameternya

  • ATAU GANTIKAN

    Jika telah ditentukan, maka prosedur dengan nama yang sama akan digantikan. Anda tidak dapat mengganti fungsi yang ada dengan prosedur; melakukannya akan meningkatkan ROUTINE_ALREADY_EXISTS. Anda tidak dapat menentukan parameter ini dengan IF NOT EXISTS; menentukan kedua kenaikan INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • JIKA TIDAK ADA

    Jika ditentukan, buat prosedur hanya ketika prosedur dengan nama tersebut belum ada. Jika ada prosedur dengan nama yang sama, pernyataan akan diabaikan. Anda tidak dapat menentukan parameter ini dengan OR REPLACE; menentukan kedua kenaikan INVALID_SQL_SYNTAX. CREATE_ROUTINE_WITH_IF_NOT_EXISTS_AND_REPLACE.

  • procedure_name

    Nama untuk prosedur. Anda dapat secara opsional memenuhi syarat nama prosedur dengan nama skema. Jika nama tidak memenuhi syarat, prosedur permanen dibuat dalam skema saat ini.

    Nama prosedur harus unik untuk semua rutinitas (prosedur dan fungsi) dalam skema. Jika rutinitas dengan nama yang sama ada dan tidak OR REPLACE ditentukanIF NOT EXISTS, Azure Databricks menaikkan ROUTINE_ALREADY_EXISTS.

  • procedure_parameter

    Menentukan parameter prosedur.

    • parameter_name

      Nama parameter harus unik dalam prosedur; jika tidak, Azure Databricks menaikkan DUPLICATE_ROUTINE_PARAMETER_NAMES.

    • IN, INOUT, atau OUT

      Penjelasan opsional tentang mode parameter.

      • DI

        Menentukan parameter input saja. Ini adalah default.

      • INOUT

        Menentukan parameter yang menerima argumen input-output. Jika prosedur selesai tanpa kesalahan yang tidak tertangani, prosedur akan mengembalikan nilai parameter akhir sebagai output.

      • KELUAR

        ** Memastikan parameter output. Parameter diinisialisasi ke NULL dan, jika prosedur selesai tanpa kesalahan yang tidak tertangani, parameter akan mengembalikan nilai parameter akhir sebagai output.

    • data_type

      Jenis data apa pun yang didukung.

    • default_expression DEFAULT

      Opsional default yang akan digunakan ketika pemanggilan fungsi tidak menetapkan argumen ke parameter. default_expression harus dapat ditransmisikan ke data_type. Ekspresi tidak boleh mereferensikan parameter lain atau mengandung subkueri.

      Saat Anda menentukan default untuk satu parameter, semua parameter berikut juga harus memiliki default.

      DEFAULT tidak didukung untuk OUT parameter atau INOUT ; menentukan satu kenaikan PROCEDURE_CREATION_PARAMETER_OUT_INOUT_WITH_DEFAULT.

    • KOMENTAR komentar

      Deskripsi opsional parameter. comment harus berupa nilai literal STRING.

  • pernyataan_kompleks

    Pernyataan majemuk SQL (BEGIN ... END) dengan definisi Prosedur SQL.

    Ketika prosedur dibuat, kebenaran sintaksis divalidasi. Isi prosedur tidak divalidasi untuk kebenaran semantik sampai prosedur dipanggil.

  • karakteristik

    Salah satu dari SQL SECURITY INVOKER atau SQL SECURITY DEFINER, dan LANGUAGE SQL diperlukan. Semua lainnya bersifat opsional. Anda dapat menentukan sejumlah karakteristik dalam urutan apa pun, tetapi Anda dapat menentukan setiap klausa hanya sekali.

    • BAHASA SQL

      Bahasa implementasi fungsi.

    • PEMANGGIL KEAMANAN SQL

      Menentukan bahwa setiap pernyataan SQL dalam isi prosedur akan dijalankan di bawah otoritas pengguna yang memanggil prosedur.

      Saat menyelesaikan hubungan dan rutinitas dalam isi prosedur, Azure Databricks menggunakan katalog saat ini dan skema saat ini pada saat pemanggilan.

      Lihat Pengguna dan pengguna sesi yang berwenang untuk bagaimana pengguna yang berwenang dan pengguna sesi bereaksi di dalam badan prosedur dan di seluruh panggilan berlapis.

    • PENDEFINISI KEAMANAN SQL

      Berlaku untuk:centang ditandai ya Databricks SQL

      Menentukan bahwa setiap pernyataan SQL dalam isi prosedur selalu dijalankan di bawah otoritas pemilik (pendefinisi) prosedur, terlepas dari pengguna mana yang memanggil prosedur. Artinya, pemilik adalah pengguna yang berwenang untuk tubuh. Pemanggil hanya memerlukan EXECUTE hak istimewa pada prosedur; semua pemeriksaan akses pada relasi, rutinitas, dan objek lain yang direferensikan dari tubuh dievaluasi terhadap pengguna yang berwenang.

      Ketika menyelesaikan hubungan dan rutinitas dalam isi prosedur, Azure Databricks menggunakan katalog dan skema yang saat ini pada saat prosedur dibuat. Objek cakupan sesi pemanggil, seperti tampilan sementara, tabel sementara, variabel sesi, dan fungsi cakupan sesi, dikecualikan dari jalur pencarian resolusi di dalam isi, sehingga tidak dapat direferensikan oleh nama yang tidak memenuhi syarat. Mereka tetap dapat diakses ketika dirujuk session dengan kualifikasi skema, misalnya session.object_name atau system.session.object_name.

      Konfigurasi SQL (misalnya, ANSI_MODE atau zona waktu default) yang memengaruhi semantik pernyataan dalam isi juga ditangkap pada waktu pembuatan dan digunakan selama setiap pemanggilan prosedur, terlepas dari pengaturan sesi pemanggil.

      Di dalam isi SQL SECURITY DEFINER , current_catalog mengembalikan katalog yang ada saat ini ketika prosedur dibuat, dan current_schema dan current_database mengembalikan skema yang ada saat ini ketika prosedur dibuat.

      SQL SECURITY DEFINER tidak mengubah nilai session_user: terus mengembalikan pengguna yang mengeluarkan CALL. Lihat Pengguna dan pengguna sesi yang berwenang untuk bagaimana pengguna yang berwenang dan pengguna sesi berbeda di dalam isi SQL SECURITY DEFINER .

    • TIDAK DETERMINISTIK

      Prosedur diasumsikan nondeterministik, yang berarti dapat mengembalikan hasil yang berbeda pada setiap pemanggilan, bahkan ketika dipanggil dengan argumen yang sama.

    • KOMENTAR PROSEDUR

      Komentar tentang prosedur. procedure_comment harus diartikan secara STRING harfiah. Defaultnya adalah NULL.

    • KOLASI DEFAULT default_collation_name

      Berlaku untuk:check ditandai ya pemeriksaan Databricks SQL ditandai ya Databricks Runtime 17.1 ke atas

      Mengatur kolase default prosedur. Kolase default prosedur digunakan sebagai kolase default untuk parameter prosedur, DEFAULT ekspresi untuk parameter, STRING variabel lokal yang diketik yang dideklarasikan dalam isi prosedur, dan STRING literal yang digunakan dalam isi prosedur.

      Dalam Databricks Runtime 17.1 hingga Databricks Runtime 18.2, default_collation_name harus UTF8_BINARY. Klausa ini wajib jika skema di mana prosedur dibuat memiliki kolaborasi default selain UTF8_BINARY.

      Berlaku untuk:check ditandai ya pemeriksaan Databricks SQL ditandai ya Databricks Runtime 18 LTS ke atas

      Note

      Databricks Runtime 18 lebih baru dari Databricks Runtime 18.0, 18.1, dan 18.2. Fitur yang sebelumnya akan dikirim sebagai versi bernomor yang lebih baru sekarang dikirim sebagai pembaruan tanggal ke Databricks Runtime 18 sebagai gantinya. Untuk detailnya, lihat Tentang catatan rilis terpadu.

      default_collation_name dapat berupa nama kolase yang didukung.

      Jika tidak ditentukan, kolaborasi default berasal dari skema tempat prosedur dibuat.

    • MEMODIFIKASI DATA SQL

      Prosedur diasumsikan untuk memodifikasi data SQL.

Kondisi kesalahan umum

Contoh

-- Demonstrate INOUT and OUT parameter usage.
> CREATE OR REPLACE PROCEDURE add(x INT, y INT, OUT sum INT, INOUT total INT)
    LANGUAGE SQL
    SQL SECURITY INVOKER
    COMMENT 'Add two numbers'
    AS BEGIN
        SET sum = x + y;
        SET total = total + sum;
    END;
> DECLARE sum INT;
> DECLARE total INT DEFAULT 0;
> CALL add(1, 2, sum, total);
> SELECT sum, total;
 3 3
> CALL add(3, 4, sum, total);
 7 10

-- The last executed query is the result set of a procedure
> CREATE PROCEDURE greeting(IN mode STRING COMMENT 'informal or formal')
    LANGUAGE SQL
    SQL SECURITY INVOKER
    AS BEGIN
        SELECT 'Hello!';
        CASE mode WHEN 'informal' THEN SELECT 'Hi!';
                  WHEN 'formal' THEN SELECT 'Pleased to meet you.';
        END CASE;
    END;
> CALL greeting('informal');
  Hi!

> CALL greeting('formal');
  Pleased to meet you.

> CALL greeting('casual');
  Hello!

-- Use SQL SECURITY DEFINER so the procedure runs with the owner's privileges
-- and references its creation-time catalog and schema. The invoker only needs
-- EXECUTE on `audit_app.ops.log_event`; they do not need any privileges on the
-- underlying `audit_app.private.audit_log` table.
> USE CATALOG audit_app;
> USE SCHEMA ops;
> CREATE OR REPLACE PROCEDURE log_event(IN event STRING)
    LANGUAGE SQL
    SQL SECURITY DEFINER
    MODIFIES SQL DATA
    AS BEGIN
        INSERT INTO audit_app.private.audit_log
          VALUES (current_user(), current_catalog(), current_schema(), event);
    END;

-- Even when invoked from a different catalog/schema and by a different user,
-- the body still inserts into `audit_app.private.audit_log`, with
-- `current_catalog()` and `current_schema()` returning the values frozen at
-- creation time. `session_user()` is unaffected by `SQL SECURITY DEFINER`
-- and records the actual invoker -- which is what audit logs typically want.
> USE CATALOG sales;
> USE SCHEMA reports;
> CALL audit_app.ops.log_event('checkout_completed');