Hướng dẫn stored procedure javascript - thủ tục lưu trữ javascript

Chuyển đến nội dung chính

Trình duyệt này không còn được hỗ trợ nữa.

Show

Hãy nâng cấp lên Microsoft Edge để tận dụng các tính năng mới nhất, bản cập nhật bảo mật và hỗ trợ kỹ thuật.

Đưa tên biến trong trích dẫn kép trong mã SQL.

  • Để biết thêm chi tiết, xem các đối số JavaScript và các giá trị được trả về.
  • Thủ tục lưu trữ không bao giờ kết thúc chạy
  • Bạn có thể có một vòng lặp vô hạn trong mã JavaScript của mình.

Kiểm tra và sửa bất kỳ vòng lặp vô hạn.

Lỗi: ________ 149¶

Hướng dẫn stored procedure javascript - thủ tục lưu trữ javascript
NoSQL

Quy trình được lưu trữ của bạn có thể chứa SQLTEXT, khi nó nên có SQLText, (thứ nhất đều là chữ thường; trường hợp thứ hai là trường hợp hỗn hợp).

Sử dụng SQLText.

Lỗi: ________ 150¶

Kiểm tra và sửa bất kỳ vòng lặp vô hạn. Cụ thể, đảm bảo rằng bạn ngừng gọi cho hàng tiếp theo khi hết kết quả (nghĩa là khi

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
51 trả về
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
52).

Cách viết các thủ tục được lưu trữ và kích hoạt trong Azure Cosmos DB bằng cách sử dụng API truy vấn JavaScript

/**
 * Insert an item and update metadata doc: minSize, maxSize, totalSize based on item.size.
 */
function insertDocumentAndUpdateMetadata(item) {
  // HTTP error codes sent to our callback function by CosmosDB server.
  var ErrorCode = {
    RETRY_WITH: 449,
  }

  var isAccepted = __.createDocument(__.getSelfLink(), item, {}, function(err, item, options) {
    if (err) throw err;

    // Check the item (ignore items with invalid/zero size and metadata itself) and call updateMetadata.
    if (!item.isMetadata && item.size > 0) {
      // Get the metadata. We keep it in the same container. it's the only item that has .isMetadata = true.
      var result = __.filter(function(x) {
        return x.isMetadata === true
      }, function(err, feed, options) {
        if (err) throw err;

        // We assume that metadata item was pre-created and must exist when this script is called.
        if (!feed || !feed.length) throw new Error("Failed to find the metadata item.");

        // The metadata item.
        var metaItem = feed[0];

        // Update metaDoc.minSize:
        // for 1st document use doc.Size, for all the rest see if it's less than last min.
        if (metaItem.minSize == 0) metaItem.minSize = item.size;
        else metaItem.minSize = Math.min(metaItem.minSize, item.size);

        // Update metaItem.maxSize.
        metaItem.maxSize = Math.max(metaItem.maxSize, item.size);

        // Update metaItem.totalSize.
        metaItem.totalSize += item.size;

        // Update/replace the metadata item in the store.
        var isAccepted = __.replaceDocument(metaItem._self, metaItem, function(err) {
          if (err) throw err;
          // Note: in case concurrent updates causes conflict with ErrorCode.RETRY_WITH, we can't read the meta again
          //       and update again because due to Snapshot isolation we will read same exact version (we are in same transaction).
          //       We have to take care of that on the client side.
        });
        if (!isAccepted) throw new Error("replaceDocument(metaItem) returned false.");
      });
      if (!result.isAccepted) throw new Error("filter for metaItem returned false.");
    }
  });
  if (!isAccepted) throw new Error("createDocument(actual item) returned false.");
}

Bài viết

10/12/2022

  • 2 Phú

  • Trong bài viết nào

  • Áp dụng cho: NOQLL

  • Azure Cosmos DB cho phép bạn thực hiện các truy vấn được tối ưu hóa bằng cách sử dụng giao diện JavaScript trôi chảy mà không có bất kỳ kiến ​​thức nào về ngôn ngữ SQL có thể được sử dụng để viết các quy trình hoặc kích hoạt được lưu trữ. Để tìm hiểu thêm về hỗ trợ API truy vấn JavaScript trong Azure Cosmos DB, hãy xem làm việc với API truy vấn tích hợp ngôn ngữ JavaScript trong bài viết của Azure Cosmos DB.

  • Quy trình được lưu trữ bằng API truy vấn JavaScript

Mẫu mã sau đây là một ví dụ về cách API truy vấn JavaScript được sử dụng trong bối cảnh của quy trình được lưu trữ. Quy trình được lưu trữ chèn một mục DB Azure Cosmos được chỉ định bởi tham số đầu vào và cập nhật tài liệu siêu dữ liệu bằng cách sử dụng phương thức var stmt = snowflake.createStatement( { sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);", binds:["LiteralValue1", variable2] } ); 1, với các minSize, tối đa hóa và tổng số dựa trên thuộc tính kích thước của mục đầu vào.

Ghi chú

Đưa tên biến trong trích dẫn kép trong mã SQL.

Để biết thêm chi tiết, xem các đối số JavaScript và các giá trị được trả về.

Thủ tục lưu trữ không bao giờ kết thúc chạyCALL (with Anonymous Procedure). Creating and calling an anonymous procedure does not require a role with CREATE PROCEDURE schema privileges.

Bạn có thể có một vòng lặp vô hạn trong mã JavaScript của mình.

Kiểm tra và sửa bất kỳ vòng lặp vô hạn.

Lỗi: ________ 149¶

Quy trình được lưu trữ của bạn có thể chứa SQLTEXT, khi nó nên có SQLText, (thứ nhất đều là chữ thường; trường hợp thứ hai là trường hợp hỗn hợp).

  • Sử dụng SQLText.

  • Lỗi: ________ 150¶

  • Kiểm tra và sửa bất kỳ vòng lặp vô hạn. Cụ thể, đảm bảo rằng bạn ngừng gọi cho hàng tiếp theo khi hết kết quả (nghĩa là khi

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    51 trả về
    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    52).

Chủ đề này giải thích cách viết mã JavaScript cho một thủ tục được lưu trữ.

  • Ghi chú

  • Để tạo và gọi một thủ tục ẩn danh, hãy sử dụng cuộc gọi (với quy trình ẩn danh). Tạo và gọi một thủ tục ẩn danh không yêu cầu vai trò với các đặc quyền Lược đồ quy trình Tạo.

  • Trong chủ đề này:

  • Hiểu API JavaScript

API JavaScript cho các quy trình được lưu trữ tương tự, nhưng không giống với API trong các đầu nối và trình điều khiển Bông tuyết (Node.js, JDBC, Python, v.v.).JavaScript Stored Procedures API.

API cho phép bạn thực hiện các hoạt động như:

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();

Thực hiện một câu lệnh SQL.

Lấy kết quả của một truy vấn (tức là một tập kết quả).

Truy xuất siêu dữ liệu về tập kết quả (số lượng cột, loại dữ liệu của các cột, v.v.).

Các hoạt động này được thực hiện bằng cách gọi các phương thức trên các đối tượng sau:

create or replace procedure read_result_set()
  returns float not null
  language javascript
  as     
  $$  
    var my_sql_command = "select * from table1";
    var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
    var result_set1 = statement1.execute();
    // Loop through the results, processing one row at a time... 
    while (result_set1.next())  {
       var column1 = result_set1.getColumnValue(1);
       var column2 = result_set1.getColumnValue(2);
       // Do something with the retrieved values...
       }
  return 0.0; // Replace with something more useful.
  $$
  ;

var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);
4, có các phương thức để tạo đối tượng
var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);
5 và thực thi lệnh SQL.Examples section (at the end of this topic) provides additional examples that exercise each of the objects, and many of the methods, in the stored procedure JavaScript API.

var stmt = snowflake.createStatement( { sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);", binds:["LiteralValue1", variable2] } ); 5, giúp bạn thực hiện các câu lệnh đã chuẩn bị và truy cập siêu dữ liệu cho các câu lệnh đã chuẩn bị đó và cho phép bạn lấy lại một đối tượng kết quả.

var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);
7, giữ kết quả của một truy vấn (ví dụ: các hàng dữ liệu được truy xuất cho một câu lệnh Chọn).

var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);
8, là một phần mở rộng của ngày JavaScript (với các phương thức bổ sung) và đóng vai trò là loại trả lại cho các loại dữ liệu SQL SQL SQL Timestamp_ltz, Timestamp_ntz và Timestamp_tz.

  • Các đối tượng này được mô tả chi tiết trong API quy trình lưu trữ JavaScript.

  • Một quy trình được lưu trữ điển hình chứa mã tương tự như mã giả sau:

Chuyển đổi JavaScript sang SQL có thể xảy ra khi:

  • Trả lại một giá trị từ thủ tục được lưu trữ. Câu lệnh

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    05 thường chứa biến JavaScript phải được chuyển đổi thành kiểu dữ liệu SQL.

  • Khi tự động xây dựng câu lệnh SQL sử dụng giá trị trong biến JavaScript.

  • Khi ràng buộc một biến JavaScript giá trị với một câu lệnh đã chuẩn bị.

Các phần dưới đây giải thích cách dữ liệu được chuyển đổi từ SQL sang JavaScript hoặc từ JavaScript sang SQL.

Chuyển đổi từ SQL sang JavaScript¶

Bảng sau đây cho thấy các loại dữ liệu SQL của Snowflake và các loại dữ liệu JavaScript tương ứng:

Kiểu dữ liệu SQL

Kiểu dữ liệu JavaScript

Ghi chú

MẢNG

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
06

Boolean

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
07

NGÀY

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
08

Real, Float, Float8, Float4, Double, Double Precision

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
09

THỜI GIAN

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
10

Timestamp, Timestamp_Ltz, Timestamp_NTZ, Timestamp_Tz

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
08 hoặc
var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);
8

Khi dấu thời gian được truyền như một đối số cho một quy trình được lưu trữ, dấu thời gian được chuyển đổi thành đối tượng JavaScript

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
08. Trong các tình huống khác (ví dụ: khi truy xuất từ ​​
var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);
7), dấu thời gian được chuyển đổi thành đối tượng
var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);
8. Để biết thêm chi tiết về kiểu dữ liệu
var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);
8, không phải là loại dữ liệu JavaScript tiêu chuẩn, hãy xem API quy trình lưu trữ JavaScript.JavaScript Stored Procedures API.

Varchar, char, ký tự, chuỗi, văn bản

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
10

KHÁC NHAU

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
06

Ví dụ: nếu câu lệnh SQL của bạn chọn một cột biến thể từ bảng Bông tuyết, thì khi bạn sao chép giá trị từ

var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);
7 sang biến JavaScript, biến JavaScript phải thuộc loại
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
06.

Không phải tất cả các loại dữ liệu SQL của Snowflake đều có loại dữ liệu JavaScript tương ứng. Ví dụ: JavaScript không hỗ trợ trực tiếp các loại dữ liệu số nguyên hoặc số. Trong những trường hợp này, bạn nên chuyển đổi kiểu dữ liệu SQL thành loại dữ liệu thay thế thích hợp. Ví dụ: bạn có thể chuyển đổi số nguyên SQL thành phao SQL, sau đó có thể được chuyển đổi thành giá trị JavaScript của loại dữ liệu

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
09.

Bảng bên dưới hiển thị các chuyển đổi thích hợp cho các loại dữ liệu SQL không tương thích:

Kiểu dữ liệu SQL không tương thích

Kiểu dữ liệu SQL tương thích

Số nguyên

TRÔI NỔI

Số, số, thập phân

TRÔI NỔI

Số, số, thập phân

Uint8Array

Nhị phân

Uint8Array

SỰ VẬT

Chuyển đổi từ JavaScript sang SQL¶

Khi trả về các giá trị

Loại trả lại của một thủ tục được lưu trữ được khai báo trong định nghĩa thủ tục được lưu trữ. Nếu câu lệnh

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
05 trong JavaScript trả về một loại dữ liệu khác với quy trình được lưu trữ, loại trả về được khai báo, giá trị JavaScript sẽ được chuyển vào loại dữ liệu SQL nếu có thể. Ví dụ: nếu một số được trả về, nhưng quy trình được lưu trữ được khai báo là trả về một chuỗi, số được chuyển đổi thành một chuỗi trong JavaScript, sau đó được sao chép vào chuỗi được trả về trong câu lệnh SQL. .

Nếu không có diễn viên hợp lệ cho chuyển đổi tồn tại, thì xảy ra lỗi.

Khi các giá trị ràng buộc

  • number.

  • string.

  • Khi bạn liên kết các biến JavaScript với các câu lệnh SQL, Snowflake đã chuyển đổi từ các loại dữ liệu JavaScript thành các loại dữ liệu SQL. Bạn có thể liên kết các biến của các loại dữ liệu JavaScript sau:JavaScript Stored Procedures API.)

Sfdate. .Binding Variables.

Để biết thêm thông tin về ràng buộc, bao gồm một số ví dụ, xem các biến ràng buộc.

Mẹo chung¶

Tiếp tục dòng

  • Các câu lệnh SQL có thể khá dài, và không phải lúc nào cũng thực tế để phù hợp với chúng trên một dòng. JavaScript coi một dòng mới là kết thúc của một tuyên bố. Nếu bạn muốn chia một câu lệnh SQL dài trên nhiều dòng, bạn có thể sử dụng các kỹ thuật JavaScript thông thường để xử lý các chuỗi dài, bao gồm:

    var sql_command = "SELECT * \
                           FROM table1;";
    

  • Đặt một dấu gạch chéo ngược (ký tự tiếp tục dòng) ngay trước khi kết thúc dòng. Ví dụ:

    var sql_command = `SELECT *
                           FROM table1;`;
    

  • Sử dụng Backticks (Mặt sau đơn) thay vì Double Trích dẫn xung quanh Chuỗi. Ví dụ:

    var sql_command = "SELECT col1, col2"
    sql_command += "     FROM table1"
    sql_command += "     WHERE col1 >= 100"
    sql_command += "     ORDER BY col2;"
    

Tích lũy chuỗi. Ví dụ:

Cân nhắc thủ tục lưu trữ JavaScript

Phạm vi số JavaScript

Phạm vi cho các số có chính xác còn nguyên vẹn là từ

-(2^53 -1)

đến

(2^53 -1)

CREATE OR REPLACE FUNCTION num_test(a double)
  RETURNS string
  LANGUAGE JAVASCRIPT
AS
$$
  return A;
$$
;

select hash(1) AS a, 
       num_test(hash(1)) AS b, 
       a - b;
+----------------------+----------------------+------------+
|                    A | B                    |      A - B |
|----------------------+----------------------+------------|
| -4730168494964875235 | -4730168494964875000 | -235.00000 |
+----------------------+----------------------+------------+

Phạm vi của các giá trị hợp lệ trong số lượng tuyết (P, S) và các loại dữ liệu kép lớn hơn. Lấy một giá trị từ Bông tuyết và lưu trữ nó trong một biến số JavaScript có thể dẫn đến mất độ chính xác. Ví dụ:

Hai cột đầu tiên phải khớp và thứ ba phải chứa 0,0.

Vấn đề áp dụng cho các chức năng do người dùng JavaScript xác định (UDFS) và các thủ tục được lưu trữ.

Sau đó, bạn có thể trả lại chuỗi từ quy trình được lưu trữ và chuyển chuỗi vào một loại dữ liệu số trong SQL.

Xử lý lỗi JavaScript

Vì một quy trình được lưu trữ được viết bằng JavaScript, nó có thể sử dụng cú pháp thử/bắt cú pháp thử JavaScript.

Quy trình được lưu trữ có thể ném một ngoại lệ được xác định trước hoặc ngoại lệ tùy chỉnh. Một ví dụ đơn giản về việc ném một ngoại lệ tùy chỉnh là ở đây.here.

Bạn có thể thực hiện các câu lệnh SQL của mình trong một khối thử. Nếu xảy ra lỗi, thì khối bắt của bạn có thể quay lại tất cả các câu lệnh (nếu bạn đặt các câu lệnh vào một giao dịch). Phần ví dụ chứa một ví dụ về việc quay lại một giao dịch trong một quy trình được lưu trữ.rolling back a transaction in a stored procedure.

Hạn chế đối với các thủ tục được lưu trữ Jo

Các thủ tục được lưu trữ có các hạn chế sau:

  • Mã JavaScript không thể gọi hàm JavaScript

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    25.

  • Các thủ tục lưu trữ JavaScript hỗ trợ truy cập vào thư viện JavaScript tiêu chuẩn. Lưu ý rằng điều này loại trừ nhiều đối tượng và phương thức thường được cung cấp bởi các trình duyệt. Không có cơ chế để nhập, bao gồm hoặc gọi các thư viện bổ sung. Cho phép các thư viện bên thứ 3 có thể tạo các lỗ hổng bảo mật.

  • Mã JavaScript được thực thi trong một công cụ bị hạn chế, ngăn chặn các cuộc gọi hệ thống từ bối cảnh JavaScript (ví dụ: không truy cập mạng và đĩa) và ràng buộc các tài nguyên hệ thống có sẵn cho động cơ, cụ thể là bộ nhớ.

Độ nhạy của trường hợp trong các đối số JavaScript

Tên đối số không nhạy cảm trường hợp trong phần SQL của mã thủ tục được lưu trữ, nhưng nhạy cảm trường hợp trong phần JavaScript.

Đối với các quy trình được lưu trữ (và UDF) sử dụng JavaScript, số nhận dạng (như tên đối số) trong phần SQL của câu lệnh được chuyển đổi thành tự động chữ hoa Còn lại trong trường hợp ban đầu của họ. Điều này có thể khiến thủ tục được lưu trữ của bạn thất bại mà không trả lại thông báo lỗi rõ ràng vì các đối số không thấy.

Dưới đây là một ví dụ về quy trình được lưu trữ trong đó tên của một đối số trong mã JavaScript không khớp với tên của đối số trong mã SQL chỉ vì trường hợp sẽ khác nhau:

Trong ví dụ dưới đây, câu lệnh gán đầu tiên là không chính xác vì tên

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
26 nằm trong trường hợp thường xuyên.

CREATE PROCEDURE f(argument1 VARCHAR)
RETURNS VARCHAR
LANGUAGE JAVASCRIPT
AS
$$
var local_variable1 = argument1;  // Incorrect
var local_variable2 = ARGUMENT1;  // Correct
$$;

Sử dụng các định danh chữ hoa (đặc biệt là tên đối số) một cách nhất quán trên các câu lệnh SQL của bạn và mã JavaScript có xu hướng giảm các lỗi im lặng.

DELIMITERS JAVASCRIPT

Phần JavaScript của mã thủ tục được lưu trữ phải được đặt trong một trong hai trích dẫn

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
27 hoặc dấu hiệu đô la kép
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
28.

Sử dụng

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
28 giúp xử lý mã JavaScript dễ dàng hơn có chứa các trích dẫn đơn mà không cần thoát khỏi các trích dẫn đó.

Các biến ràng buộc

Liên kết một biến với câu lệnh SQL cho phép bạn sử dụng giá trị của biến trong câu lệnh.

Bạn có thể liên kết các giá trị null cũng như các giá trị không null.

Kiểu dữ liệu của biến phải phù hợp cho việc sử dụng giá trị trong câu lệnh SQL. Hiện tại, chỉ có thể bị ràng buộc các biến JavaScript của số, chuỗi và SFDATE. .SfDate can be bound. (For details about the mapping between SQL data types and JavaScript data types, see SQL and JavaScript Data Type Mapping.)

Dưới đây là một ví dụ ngắn về ràng buộc:

var stmt = snowflake.createStatement(
   {
   sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
   binds:["LiteralValue1", variable2]
   }
);

Đây là một ví dụ đầy đủ hơn. Ví dụ này liên kết thông tin dấu thời gian. Vì liên kết trực tiếp của dữ liệu dấu thời gian SQL không được hỗ trợ, ví dụ này vượt qua dấu thời gian như một varchar, sau đó liên kết điều đó với câu lệnh. Lưu ý rằng bản thân câu lệnh SQL đã chuyển đổi varchar thành dấu thời gian bằng cách gọi hàm to_timestamp ():

Hàm đơn giản này trả về đúng nếu dấu thời gian được chỉ định là trước bây giờ và sai.

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
0

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
1

Điều này cho thấy cách liên kết một varchar, dấu thời gian_ltz và các loại dữ liệu khác với câu lệnh

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
30. Timestamp_ltz liên kết một biến SFDATE được tạo bên trong quy trình được lưu trữ.SfDate variable that is created inside the stored procedure.

Tạo một bảng.

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
2

Tạo một thủ tục được lưu trữ. Quy trình này chấp nhận

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
31 và chuyển đổi varchar thành
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
32 bằng cách sử dụng SQL. Quy trình sau đó lấy lại giá trị được chuyển đổi từ một kết quả. Giá trị được lưu trữ trong một biến JavaScript của loại SFDATE. Quy trình được lưu trữ sau đó liên kết cả bản gốc
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
31 và
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
32 với câu lệnh
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
30. Điều này cũng cho thấy sự ràng buộc của dữ liệu số JavaScript.SfDate. The stored procedure then binds both the original
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
31 and the
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
32 to an
var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
30 statement. This also demonstrates binding of JavaScript numeric data.

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
3

Gọi thủ tục.

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
4

Xác minh rằng hàng đã được chèn.

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
5

Để biết các ví dụ bổ sung về dữ liệu liên kết trong JavaScript, hãy xem các tham số câu lệnh Binding.Binding Statement Parameters.

Yêu cầu mã

Mã JavaScript phải xác định một đối tượng JavaScript theo nghĩa đen cho quy trình được lưu trữ có hiệu lực.

Nếu mã JavaScript không đáp ứng yêu cầu này, quy trình được lưu trữ sẽ được tạo; Tuy nhiên, nó sẽ thất bại khi được gọi.

Kích thước mã

Bông tuyết giới hạn kích thước tối đa của mã nguồn JavaScript trong phần thân của quy trình lưu trữ JavaScript. Bông tuyết khuyến nghị giới hạn kích thước đến 100 kb. (Mã được lưu trữ ở dạng nén và giới hạn chính xác phụ thuộc vào khả năng nén của mã.)

Lỗi thời gian chạy lor

Hầu hết các lỗi trong các thủ tục được lưu trữ hiển thị trong thời gian chạy vì mã JavaScript được giải thích tại thời điểm quy trình được lưu trữ chạy thay vì khi quy trình được lưu trữ được tạo.

Hỗ trợ cho SQL linh động

Các thủ tục được lưu trữ có thể được sử dụng để xây dựng các câu lệnh SQL tự động. Ví dụ: bạn có thể xây dựng một chuỗi lệnh SQL có chứa hỗn hợp SQL được cấu hình sẵn và đầu vào người dùng (ví dụ: số tài khoản người dùng).

Đối với các ví dụ, hãy xem động tạo ra một câu lệnh SQL và phần ví dụ.Dynamically Creating a SQL Statement and the Examples section.

API đồng bộ

API cho các quy trình lưu trữ của bông tuyết là đồng bộ. Trong một quy trình được lưu trữ, bạn chỉ có thể chạy một luồng tại một thời điểm.

Lưu ý rằng điều này khác với quy tắc cho thực thi javaScript với đầu nối Node.js, cho phép bạn chạy các luồng không đồng bộ.

Ví dụ;

Ví dụ cơ bản

Ví dụ sau đây cho thấy cú pháp cơ bản của việc tạo và gọi một quy trình được lưu trữ. Nó không thực hiện bất kỳ SQL hoặc mã thủ tục. Tuy nhiên, nó cung cấp một điểm khởi đầu cho các ví dụ thực tế hơn sau:

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
6

Lưu ý rằng DELIMITER

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
28 đánh dấu sự khởi đầu và kết thúc của mã JavaScript.

Bây giờ hãy gọi thủ tục bạn vừa tạo:

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
7

Ví dụ sau đây minh họa cách thực thi câu lệnh SQL bên trong quy trình được lưu trữ:

  1. Tạo một bảng:

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    8

  2. Tạo một thủ tục được lưu trữ. Điều này chèn một hàng vào một bảng hiện có có tên

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    37 và trả về giá trị thành công. Giá trị trả về không đặc biệt hữu ích từ góc độ SQL, nhưng nó cho phép bạn trả về thông tin trạng thái (ví dụ: thành công.

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    9

  3. Gọi thủ tục được lưu trữ:

    create or replace procedure read_result_set()
      returns float not null
      language javascript
      as     
      $$  
        var my_sql_command = "select * from table1";
        var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
        var result_set1 = statement1.execute();
        // Loop through the results, processing one row at a time... 
        while (result_set1.next())  {
           var column1 = result_set1.getColumnValue(1);
           var column2 = result_set1.getColumnValue(2);
           // Do something with the retrieved values...
           }
      return 0.0; // Replace with something more useful.
      $$
      ;
    
    0

  4. Xác nhận rằng quy trình được lưu trữ đã chèn hàng:

    create or replace procedure read_result_set()
      returns float not null
      language javascript
      as     
      $$  
        var my_sql_command = "select * from table1";
        var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
        var result_set1 = statement1.execute();
        // Loop through the results, processing one row at a time... 
        while (result_set1.next())  {
           var column1 = result_set1.getColumnValue(1);
           var column2 = result_set1.getColumnValue(2);
           // Do something with the retrieved values...
           }
      return 0.0; // Replace with something more useful.
      $$
      ;
    
    1

Ví dụ sau lấy kết quả:

  1. Tạo một quy trình để đếm số lượng hàng trong bảng (tương đương với

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    38):

    create or replace procedure read_result_set()
      returns float not null
      language javascript
      as     
      $$  
        var my_sql_command = "select * from table1";
        var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
        var result_set1 = statement1.execute();
        // Loop through the results, processing one row at a time... 
        while (result_set1.next())  {
           var column1 = result_set1.getColumnValue(1);
           var column2 = result_set1.getColumnValue(2);
           // Do something with the retrieved values...
           }
      return 0.0; // Replace with something more useful.
      $$
      ;
    
    2

  2. Hỏi thủ tục được lưu trữ có bao nhiêu hàng trong bảng:

    create or replace procedure read_result_set()
      returns float not null
      language javascript
      as     
      $$  
        var my_sql_command = "select * from table1";
        var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
        var result_set1 = statement1.execute();
        // Loop through the results, processing one row at a time... 
        while (result_set1.next())  {
           var column1 = result_set1.getColumnValue(1);
           var column2 = result_set1.getColumnValue(2);
           // Do something with the retrieved values...
           }
      return 0.0; // Replace with something more useful.
      $$
      ;
    
    3

  3. Kiểm tra độc lập rằng bạn có đúng số:

    create or replace procedure read_result_set()
      returns float not null
      language javascript
      as     
      $$  
        var my_sql_command = "select * from table1";
        var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
        var result_set1 = statement1.execute();
        // Loop through the results, processing one row at a time... 
        while (result_set1.next())  {
           var column1 = result_set1.getColumnValue(1);
           var column2 = result_set1.getColumnValue(2);
           // Do something with the retrieved values...
           }
      return 0.0; // Replace with something more useful.
      $$
      ;
    
    4

Ví dụ về thủ tục lưu trữ đệ quy Or

Ví dụ sau đây cho thấy một thủ tục được lưu trữ cơ bản, nhưng không đặc biệt thực tế, được lưu trữ:

create or replace procedure read_result_set()
  returns float not null
  language javascript
  as     
  $$  
    var my_sql_command = "select * from table1";
    var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
    var result_set1 = statement1.execute();
    // Loop through the results, processing one row at a time... 
    while (result_set1.next())  {
       var column1 = result_set1.getColumnValue(1);
       var column2 = result_set1.getColumnValue(2);
       // Do something with the retrieved values...
       }
  return 0.0; // Replace with something more useful.
  $$
  ;
5

create or replace procedure read_result_set()
  returns float not null
  language javascript
  as     
  $$  
    var my_sql_command = "select * from table1";
    var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
    var result_set1 = statement1.execute();
    // Loop through the results, processing one row at a time... 
    while (result_set1.next())  {
       var column1 = result_set1.getColumnValue(1);
       var column2 = result_set1.getColumnValue(2);
       // Do something with the retrieved values...
       }
  return 0.0; // Replace with something more useful.
  $$
  ;
6

create or replace procedure read_result_set()
  returns float not null
  language javascript
  as     
  $$  
    var my_sql_command = "select * from table1";
    var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
    var result_set1 = statement1.execute();
    // Loop through the results, processing one row at a time... 
    while (result_set1.next())  {
       var column1 = result_set1.getColumnValue(1);
       var column2 = result_set1.getColumnValue(2);
       // Do something with the retrieved values...
       }
  return 0.0; // Replace with something more useful.
  $$
  ;
7

create or replace procedure read_result_set()
  returns float not null
  language javascript
  as     
  $$  
    var my_sql_command = "select * from table1";
    var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
    var result_set1 = statement1.execute();
    // Loop through the results, processing one row at a time... 
    while (result_set1.next())  {
       var column1 = result_set1.getColumnValue(1);
       var column2 = result_set1.getColumnValue(2);
       // Do something with the retrieved values...
       }
  return 0.0; // Replace with something more useful.
  $$
  ;
8

Tự động tạo câu lệnh SQL

Ví dụ sau đây cho thấy cách tạo tự động câu lệnh SQL:

Ghi chú

Như đã nêu trong SQL Injection (trong chủ đề này), hãy cẩn thận để bảo vệ chống lại các cuộc tấn công khi sử dụng SQL động.SQL Injection (in this topic), be careful to guard against attacks when using dynamic SQL.

  1. Tạo các thủ tục được lưu trữ. Quy trình này cho phép bạn vượt qua tên của một bảng và nhận số lượng hàng trong bảng đó (tương đương với

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    39):

    create or replace procedure read_result_set()
      returns float not null
      language javascript
      as     
      $$  
        var my_sql_command = "select * from table1";
        var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
        var result_set1 = statement1.execute();
        // Loop through the results, processing one row at a time... 
        while (result_set1.next())  {
           var column1 = result_set1.getColumnValue(1);
           var column2 = result_set1.getColumnValue(2);
           // Do something with the retrieved values...
           }
      return 0.0; // Replace with something more useful.
      $$
      ;
    
    9

  2. Gọi thủ tục được lưu trữ:

    create or replace procedure read_result_set()
      returns float not null
      language javascript
      as     
      $$  
        var my_sql_command = "select * from table1";
        var statement1 = snowflake.createStatement( {sqlText: my_sql_command} );
        var result_set1 = statement1.execute();
        // Loop through the results, processing one row at a time... 
        while (result_set1.next())  {
           var column1 = result_set1.getColumnValue(1);
           var column2 = result_set1.getColumnValue(2);
           // Do something with the retrieved values...
           }
      return 0.0; // Replace with something more useful.
      $$
      ;
    
    3

  3. Xác nhận rằng quy trình được lưu trữ đã chèn hàng:

    var sql_command = "SELECT * \
                           FROM table1;";
    
    1

Ví dụ sau lấy kết quả:

Tạo một quy trình để đếm số lượng hàng trong bảng (tương đương với

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
38):

  1. Hỏi thủ tục được lưu trữ có bao nhiêu hàng trong bảng:

    var sql_command = "SELECT * \
                           FROM table1;";
    
    2

  2. Kiểm tra độc lập rằng bạn có đúng số:

    var sql_command = "SELECT * \
                           FROM table1;";
    
    3

Ví dụ về thủ tục lưu trữ đệ quy Or

  1. Hỏi thủ tục được lưu trữ có bao nhiêu hàng trong bảng:

    var sql_command = "SELECT * \
                           FROM table1;";
    
    4

  2. Kiểm tra độc lập rằng bạn có đúng số:

    var sql_command = "SELECT * \
                           FROM table1;";
    
    5

Ví dụ về thủ tục lưu trữ đệ quy Or

Ví dụ sau đây cho thấy một thủ tục được lưu trữ cơ bản, nhưng không đặc biệt thực tế, được lưu trữ:

var sql_command = "SELECT * \
                       FROM table1;";
6

Tự động tạo câu lệnh SQL

Ví dụ sau đây cho thấy cách tạo tự động câu lệnh SQL:

var sql_command = "SELECT * \
                       FROM table1;";
7

var sql_command = "SELECT * \
                       FROM table1;";
8

var sql_command = "SELECT * \
                       FROM table1;";
9

Ghi chú

Như đã nêu trong SQL Injection (trong chủ đề này), hãy cẩn thận để bảo vệ chống lại các cuộc tấn công khi sử dụng SQL động.

Tạo các thủ tục được lưu trữ. Quy trình này cho phép bạn vượt qua tên của một bảng và nhận số lượng hàng trong bảng đó (tương đương với

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
39):

Hiển thị kết quả từ

var my_sql_command1 = "delete from history_table where event_year < 2016";
var statement1 = snowflake.createStatement(my_sql_command1);
statement1.execute();

var my_sql_command2 = "delete from log_table where event_year < 2016";
var statement2 = snowflake.createStatement(my_sql_command2);
statement2.execute();
40 cho cùng một bảng:

var sql_command = `SELECT *
                       FROM table1;`;
0

Bật đăng nhập:

var sql_command = `SELECT *
                       FROM table1;`;
1

Gọi thủ tục:

var sql_command = `SELECT *
                       FROM table1;`;
2

Kiểm tra xem bảng có được tạo không và các tin nhắn đã được ghi lại:

var sql_command = `SELECT *
                       FROM table1;`;
3

Quan trọng

Chèn các thông báo nhật ký vào bảng riêng lẻ có thể tốn kém và không hiệu quả, đặc biệt nếu mã ghi lại một hoặc nhiều tin nhắn mỗi hàng được xử lý.

Hơn nữa, nếu nhiều quy trình được lưu trữ thực hiện đồng thời và nếu mỗi lần nối nhiều tin nhắn vào cùng một bảng nhật ký, các tắc nghẽn đồng thời có thể xảy ra.

Để tránh các vấn đề tiềm ẩn này, mã mẫu ở trên sẽ tích lũy các tin nhắn trong một chuỗi cho đến khi thủ tục được lưu trữ kết thúc (hoặc cho đến khi bị lỗi), sau đó ghi các tin nhắn được tích lũy trong một lần chèn.

Quá tải tên thủ tục được lưu trữ tên

Như được mô tả trong các quy ước đặt tên cho các thủ tục được lưu trữ (trong chủ đề này), bạn có thể quá tải các tên thủ tục được lưu trữ. Ví dụ:Naming Conventions for Stored Procedures (in this topic), you can overload stored procedure names. For example:

  1. Đầu tiên, tạo hai quy trình được lưu trữ có cùng tên, nhưng số lượng đối số khác nhau.

    var sql_command = `SELECT *
                           FROM table1;`;
    
    4

    var sql_command = `SELECT *
                           FROM table1;`;
    
    5

  2. Tiếp theo, hãy gọi hai thủ tục:

    var sql_command = `SELECT *
                           FROM table1;`;
    
    6

    var sql_command = `SELECT *
                           FROM table1;`;
    
    7

Ghi chú

Bạn cũng phải chỉ định các loại dữ liệu của các đối số cho một số hoạt động khác trên các quy trình được lưu trữ. Ví dụ, Grant và thu hồi yêu cầu các loại đối số, cũng như tên thủ tục được lưu trữ.

Ví dụ tiếp theo về quá tải cho thấy cách kết hợp quá tải và chuyển đổi loại tự động có thể giúp bạn dễ dàng có được kết quả bất ngờ:

Tạo một quy trình được lưu trữ có tham số float:

var sql_command = `SELECT *
                       FROM table1;`;
8

Gọi thủ tục được lưu trữ hai lần. Lần đầu tiên, vượt qua một chiếc phao. Lần thứ hai, vượt qua một varchar. Varchar được chuyển đổi thành một chiếc phao và đầu ra từ mỗi cuộc gọi là giống hệt nhau:

var sql_command = `SELECT *
                       FROM table1;`;
9

Bây giờ, hãy tạo một quy trình được lưu trữ quá tải có tham số Varchar:

var sql_command = "SELECT col1, col2"
sql_command += "     FROM table1"
sql_command += "     WHERE col1 >= 100"
sql_command += "     ORDER BY col2;"
0

Bây giờ sử dụng chính xác các cuộc gọi giống như trước đây. Lưu ý sự khác biệt về đầu ra giữa hai cuộc gọi này và hai cuộc gọi trước đó.

var sql_command = "SELECT col1, col2"
sql_command += "     FROM table1"
sql_command += "     WHERE col1 >= 100"
sql_command += "     ORDER BY col2;"
1

Sử dụng result_scan để lấy kết quả từ một thủ tục được lưu trữ

Ví dụ này cho thấy cách sử dụng chức năng result_scan để truy xuất kết quả từ câu lệnh gọi:RESULT_SCAN function to retrieve the result from a CALL statement:

  1. Tạo và tải bảng:

    var sql_command = "SELECT col1, col2"
    sql_command += "     FROM table1"
    sql_command += "     WHERE col1 >= 100"
    sql_command += "     ORDER BY col2;"
    
    2

    var sql_command = "SELECT col1, col2"
    sql_command += "     FROM table1"
    sql_command += "     WHERE col1 >= 100"
    sql_command += "     ORDER BY col2;"
    
    3

  2. Tạo các thủ tục được lưu trữ. Quy trình này trả về một chuỗi được định dạng tốt trông giống như một tập hợp ba hàng, nhưng thực sự là một chuỗi duy nhất:

    var sql_command = "SELECT col1, col2"
    sql_command += "     FROM table1"
    sql_command += "     WHERE col1 >= 100"
    sql_command += "     ORDER BY col2;"
    
    4

  3. Gọi quy trình được lưu trữ, sau đó truy xuất kết quả bằng cách sử dụng result_scan:

    var sql_command = "SELECT col1, col2"
    sql_command += "     FROM table1"
    sql_command += "     WHERE col1 >= 100"
    sql_command += "     ORDER BY col2;"
    
    5

Bạn có thể thực hiện các hoạt động phức tạp hơn trên giá trị được trả về bởi hàm result_scan. Trong trường hợp này, vì giá trị được trả về là một chuỗi duy nhất, bạn có thể muốn trích xuất các hàng riêng lẻ, có vẻ như được chứa trong chuỗi đó và lưu trữ các hàng đó trong một bảng khác.

Ví dụ sau, là sự tiếp nối của ví dụ trước, minh họa một cách để làm điều này:

  1. Tạo một bảng để lưu trữ dài hạn. Bảng này chứa tên tỉnh và ID tỉnh sau khi bạn trích xuất chúng từ chuỗi được trả về bởi lệnh gọi:

    var sql_command = "SELECT col1, col2"
    sql_command += "     FROM table1"
    sql_command += "     WHERE col1 >= 100"
    sql_command += "     ORDER BY col2;"
    
    6

  2. Gọi quy trình được lưu trữ, sau đó truy xuất kết quả bằng cách sử dụng result_scan, sau đó trích xuất ba hàng từ chuỗi và đặt các hàng đó vào bảng:

    var sql_command = "SELECT col1, col2"
    sql_command += "     FROM table1"
    sql_command += "     WHERE col1 >= 100"
    sql_command += "     ORDER BY col2;"
    
    7

  3. Xác minh rằng điều này đã hoạt động bằng cách hiển thị các hàng trong bảng:

    var sql_command = "SELECT col1, col2"
    sql_command += "     FROM table1"
    sql_command += "     WHERE col1 >= 100"
    sql_command += "     ORDER BY col2;"
    
    8

Ở đây, khoảng cùng một mã, nhưng trong các bước nhỏ hơn:

  1. Tạo một bảng có tên

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    43. Bảng này tạm thời lưu trữ kết quả của lệnh cuộc gọi. Kết quả của cuộc gọi là một chuỗi duy nhất, vì vậy bảng này chỉ lưu trữ một giá trị varchar duy nhất.

    var sql_command = "SELECT col1, col2"
    sql_command += "     FROM table1"
    sql_command += "     WHERE col1 >= 100"
    sql_command += "     ORDER BY col2;"
    
    9

  2. Gọi quy trình được lưu trữ, sau đó truy xuất kết quả (một chuỗi) bằng cách sử dụng result_scan, sau đó lưu trữ nó vào bảng trung gian có tên

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    43:

    CREATE OR REPLACE FUNCTION num_test(a double)
      RETURNS string
      LANGUAGE JAVASCRIPT
    AS
    $$
      return A;
    $$
    ;
    
    0

    Điều này cho thấy hàng mới trong bảng

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    43. Hãy nhớ rằng mặc dù điều này được định dạng trông giống như ba hàng, nhưng nó thực sự là một chuỗi duy nhất:

    CREATE OR REPLACE FUNCTION num_test(a double)
      RETURNS string
      LANGUAGE JAVASCRIPT
    AS
    $$
      return A;
    $$
    ;
    
    1

    Các lệnh sau đây cho thấy cách trích xuất nhiều hàng từ chuỗi:

    CREATE OR REPLACE FUNCTION num_test(a double)
      RETURNS string
      LANGUAGE JAVASCRIPT
    AS
    $$
      return A;
    $$
    ;
    
    2

  3. Tiếp theo, tạo một bảng có tên

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    46. Bảng này sẽ giữ kết quả sau khi bạn chia nó thành các dòng/chuỗi riêng lẻ:

    CREATE OR REPLACE FUNCTION num_test(a double)
      RETURNS string
      LANGUAGE JAVASCRIPT
    AS
    $$
      return A;
    $$
    ;
    
    3

  4. Bây giờ hãy chuyển đổi một chuỗi đó trong bảng

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    43 thành ba chuỗi riêng biệt và cho thấy bây giờ nó thực sự là ba chuỗi:

    CREATE OR REPLACE FUNCTION num_test(a double)
      RETURNS string
      LANGUAGE JAVASCRIPT
    AS
    $$
      return A;
    $$
    ;
    
    4

  5. Bây giờ chuyển đổi ba chuỗi thành ba hàng trong bảng dài hạn của chúng tôi có tên

    var my_sql_command1 = "delete from history_table where event_year < 2016";
    var statement1 = snowflake.createStatement(my_sql_command1);
    statement1.execute();
    
    var my_sql_command2 = "delete from log_table where event_year < 2016";
    var statement2 = snowflake.createStatement(my_sql_command2);
    statement2.execute();
    
    48:

    CREATE OR REPLACE FUNCTION num_test(a double)
      RETURNS string
      LANGUAGE JAVASCRIPT
    AS
    $$
      return A;
    $$
    ;
    
    5

  6. Hiển thị ba hàng trong bảng dài hạn:

    CREATE OR REPLACE FUNCTION num_test(a double)
      RETURNS string
      LANGUAGE JAVASCRIPT
    AS
    $$
      return A;
    $$
    ;
    
    6

Trả về một mảng các thông báo lỗi

Quy trình được lưu trữ của bạn có thể thực thi nhiều câu lệnh SQL và bạn có thể muốn trả về thông báo trạng thái/lỗi cho mỗi câu lệnh SQL. Tuy nhiên, một thủ tục được lưu trữ trả về một hàng duy nhất; Nó không được thiết kế để trả về nhiều hàng.

Nếu tất cả các tin nhắn của bạn phù hợp với một giá trị duy nhất của mảng, bạn có thể nhận tất cả các tin nhắn từ một quy trình được lưu trữ với một số nỗ lực bổ sung.

Ví dụ sau đây hiển thị một cách để thực hiện điều này (thông báo lỗi được hiển thị không có thật, nhưng bạn có thể mở rộng mã này để hoạt động với các câu lệnh SQL thực tế của mình):

CREATE OR REPLACE FUNCTION num_test(a double)
  RETURNS string
  LANGUAGE JAVASCRIPT
AS
$$
  return A;
$$
;
7

CREATE OR REPLACE FUNCTION num_test(a double)
  RETURNS string
  LANGUAGE JAVASCRIPT
AS
$$
  return A;
$$
;
8

Hãy nhớ rằng, đây không phải là một giải pháp mục đích chung. Có giới hạn về kích thước tối đa của các loại dữ liệu mảng và toàn bộ tập kết quả của bạn phải phù hợp với một mảng.not a general purpose solution. There is a limit on the maximum size of ARRAY data types, and your entire result set must fit into a single ARRAY.

Trả về một bộ kết quả

Phần này mở rộng ví dụ trước được mô tả để trả về một mảng các thông báo lỗi. Ví dụ này là chung chung hơn và cho phép bạn trả về một kết quả được đặt từ một truy vấn.

Một thủ tục được lưu trữ trả về một hàng duy nhất chứa một cột duy nhất; Nó không được thiết kế để trả về một bộ kết quả. Tuy nhiên, nếu tập kết quả của bạn đủ nhỏ để phù hợp với một giá trị của biến thể loại hoặc mảng, bạn có thể trả về kết quả được đặt từ quy trình được lưu trữ với một số mã bổ sung:

CREATE OR REPLACE FUNCTION num_test(a double)
  RETURNS string
  LANGUAGE JAVASCRIPT
AS
$$
  return A;
$$
;
9

select hash(1) AS a, 
       num_test(hash(1)) AS b, 
       a - b;
+----------------------+----------------------+------------+
|                    A | B                    |      A - B |
|----------------------+----------------------+------------|
| -4730168494964875235 | -4730168494964875000 | -235.00000 |
+----------------------+----------------------+------------+
0

select hash(1) AS a, 
       num_test(hash(1)) AS b, 
       a - b;
+----------------------+----------------------+------------+
|                    A | B                    |      A - B |
|----------------------+----------------------+------------|
| -4730168494964875235 | -4730168494964875000 | -235.00000 |
+----------------------+----------------------+------------+
1

Điều này cho thấy cách kết hợp hai dòng trước đó thành một dòng duy nhất:

select hash(1) AS a, 
       num_test(hash(1)) AS b, 
       a - b;
+----------------------+----------------------+------------+
|                    A | B                    |      A - B |
|----------------------+----------------------+------------|
| -4730168494964875235 | -4730168494964875000 | -235.00000 |
+----------------------+----------------------+------------+
2

Để thuận tiện, bạn có thể bọc dòng trước trong một chế độ xem. Chế độ xem này cũng chuyển đổi chuỗi ‘null, thành một null thực sự. Bạn chỉ cần tạo chế độ xem một lần. Tuy nhiên, bạn phải gọi quy trình được lưu trữ ngay trước khi chọn từ chế độ xem này mỗi khi bạn sử dụng chế độ xem. Hãy nhớ rằng, cuộc gọi đến result_scan trong chế độ xem đang rút ra từ câu lệnh gần đây nhất, đó phải là cuộc gọi:must call the stored procedure immediately prior to selecting from this view every time you use the view. Remember, the call to RESULT_SCAN in the view is pulling from the most recent statement, which must be the CALL:

select hash(1) AS a, 
       num_test(hash(1)) AS b, 
       a - b;
+----------------------+----------------------+------------+
|                    A | B                    |      A - B |
|----------------------+----------------------+------------|
| -4730168494964875235 | -4730168494964875000 | -235.00000 |
+----------------------+----------------------+------------+
3

select hash(1) AS a, 
       num_test(hash(1)) AS b, 
       a - b;
+----------------------+----------------------+------------+
|                    A | B                    |      A - B |
|----------------------+----------------------+------------|
| -4730168494964875235 | -4730168494964875000 | -235.00000 |
+----------------------+----------------------+------------+
4

Bạn thậm chí có thể sử dụng nó như một chế độ xem thực (nghĩa là chọn một tập hợp con của nó):

select hash(1) AS a, 
       num_test(hash(1)) AS b, 
       a - b;
+----------------------+----------------------+------------+
|                    A | B                    |      A - B |
|----------------------+----------------------+------------|
| -4730168494964875235 | -4730168494964875000 | -235.00000 |
+----------------------+----------------------+------------+
5

Hãy nhớ rằng, đây không phải là một giải pháp mục đích chung. Có một giới hạn về kích thước tối đa của các loại dữ liệu biến thể và mảng và toàn bộ tập kết quả của bạn phải phù hợp với một biến thể hoặc mảng duy nhất.not a general purpose solution. There is a limit on the maximum size of VARIANT and ARRAY data types, and your entire result set must fit into a single VARIANT or ARRAY.

Bảo vệ quyền riêng tư

Ví dụ này cho thấy một quy trình được lưu trữ hữu ích cho một nhà bán lẻ trực tuyến. Quy trình được lưu trữ này tôn trọng quyền riêng tư của khách hàng, đồng thời bảo vệ lợi ích hợp pháp của cả nhà bán lẻ và khách hàng. Nếu một khách hàng yêu cầu nhà bán lẻ xóa dữ liệu của khách hàng vì lý do riêng tư, thì quy trình được lưu trữ này sẽ xóa hầu hết dữ liệu của khách hàng, nhưng rời khỏi lịch sử mua hàng của khách hàng nếu một trong những điều sau đây là đúng:

  • Bất kỳ mặt hàng mua nào cũng có bảo hành chưa hết hạn.

  • Khách hàng vẫn còn nợ tiền (hoặc khách hàng bị hoàn lại tiền).

Một phiên bản thế giới thực hơn của điều này sẽ xóa các hàng riêng lẻ mà thanh toán đã được thực hiện và bảo hành đã hết hạn.

  1. Bắt đầu bằng cách tạo các bảng và tải chúng:

    select hash(1) AS a, 
           num_test(hash(1)) AS b, 
           a - b;
    +----------------------+----------------------+------------+
    |                    A | B                    |      A - B |
    |----------------------+----------------------+------------|
    | -4730168494964875235 | -4730168494964875000 | -235.00000 |
    +----------------------+----------------------+------------+
    
    6

    select hash(1) AS a, 
           num_test(hash(1)) AS b, 
           a - b;
    +----------------------+----------------------+------------+
    |                    A | B                    |      A - B |
    |----------------------+----------------------+------------|
    | -4730168494964875235 | -4730168494964875000 | -235.00000 |
    +----------------------+----------------------+------------+
    
    7

  2. Tạo quy trình được lưu trữ:

    select hash(1) AS a, 
           num_test(hash(1)) AS b, 
           a - b;
    +----------------------+----------------------+------------+
    |                    A | B                    |      A - B |
    |----------------------+----------------------+------------|
    | -4730168494964875235 | -4730168494964875000 | -235.00000 |
    +----------------------+----------------------+------------+
    
    8

  3. Hiển thị dữ liệu trong các bảng trước khi xóa bất kỳ dữ liệu nào đó:

    select hash(1) AS a, 
           num_test(hash(1)) AS b, 
           a - b;
    +----------------------+----------------------+------------+
    |                    A | B                    |      A - B |
    |----------------------+----------------------+------------|
    | -4730168494964875235 | -4730168494964875000 | -235.00000 |
    +----------------------+----------------------+------------+
    
    9

  4. Khách hàng số 1 có bảo hành vẫn còn hiệu lực. Quy trình được lưu trữ xóa các nhận xét xem xét mà họ đã đăng, nhưng giữ hồ sơ mua hàng của họ vì bảo hành:

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    0

  5. Khách hàng số 2 vẫn nợ tiền. Quy trình được lưu trữ xóa nhận xét đánh giá của họ, nhưng giữ hồ sơ mua hàng của họ:

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    1

  6. Khách hàng số 3 không nợ bất kỳ khoản tiền nào (và không nợ bất kỳ khoản tiền nào). Bảo hành của họ đã hết hạn, vì vậy quy trình được lưu trữ sẽ xóa cả nhận xét xem xét và hồ sơ mua hàng:

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    2

Sử dụng các biến phiên với quyền của người gọi và các thủ tục được lưu trữ quyền của chủ sở hữu

Những ví dụ này minh họa một trong những khác biệt chính giữa quyền của người gọi và các thủ tục được lưu trữ quyền của chủ sở hữu. Họ cố gắng sử dụng các biến phiên theo hai cách:

  • Đặt biến phiên trước khi gọi quy trình được lưu trữ, sau đó sử dụng biến phiên bên trong quy trình được lưu trữ.

  • Đặt một biến phiên bên trong quy trình được lưu trữ, sau đó sử dụng biến phiên sau khi quay lại từ các quy trình được lưu trữ.

Cả hai sử dụng biến phiên và đặt biến phiên hoạt động chính xác trong quy trình lưu trữ quyền của người gọi. Cả hai đều thất bại khi sử dụng thủ tục được lưu trữ quyền của chủ sở hữu ngay cả khi người gọi là chủ sở hữu.owner.

Quyền được lưu trữ quyền của người gọi

Ví dụ sau đây cho thấy một thủ tục được lưu trữ quyền của người gọi.

  1. Tạo và tải một bảng:

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    3

  2. Đặt biến phiên:

  3. Tạo quy trình được lưu trữ quyền của người gọi sử dụng một biến phiên và đặt một biến khác:

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    4

  4. Gọi thủ tục:

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    5

  5. Xem giá trị của biến phiên được đặt bên trong quy trình được lưu trữ:

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    6

Ghi chú

Mặc dù bạn có thể đặt một biến phiên bên trong một quy trình được lưu trữ và để nó được đặt sau khi kết thúc thủ tục, Snowflake không khuyên bạn nên làm điều này.not recommend doing this.

Chủ sở hữu Quyền được lưu trữ quyền

Ví dụ sau đây cho thấy một thủ tục được lưu trữ quyền của chủ sở hữu.

  1. Tạo quy trình được lưu trữ quyền của chủ sở hữu sử dụng biến phiên:

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    7

  2. Gọi thủ tục (nó sẽ thất bại):

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    8

  3. Tạo quy trình được lưu trữ quyền của chủ sở hữu, cố gắng đặt biến phiên:

    CREATE PROCEDURE f(argument1 VARCHAR)
    RETURNS VARCHAR
    LANGUAGE JAVASCRIPT
    AS
    $$
    var local_variable1 = argument1;  // Incorrect
    var local_variable2 = ARGUMENT1;  // Correct
    $$;
    
    9

  4. Gọi thủ tục (nó sẽ thất bại):

    var stmt = snowflake.createStatement(
       {
       sqlText: "INSERT INTO table2 (col1, col2) VALUES (?, ?);",
       binds:["LiteralValue1", variable2]
       }
    );
    
    0

Xử lý sự cố¶

Kỹ thuật khắc phục sự cố chung là sử dụng khối thử/bắt JavaScript để bắt lỗi và hiển thị thông tin lỗi. Đối tượng lỗi chứa:

  • Mã lỗi.

  • Thông báo lỗi.

  • Trạng thái lỗi.

  • Stack theo dõi tại điểm thất bại.

Để biết thêm thông tin, bao gồm một ví dụ, về cách sử dụng thông tin này, xem việc bắt lỗi bằng cách sử dụng thử/bắt (trong chủ đề này).Catching an Error using Try/Catch (in this topic).

Các phần tiếp theo cung cấp các đề xuất bổ sung để giúp gỡ lỗi các vấn đề cụ thể.

Quy trình được lưu trữ hoặc UDF bất ngờ trả lại null¶

Gây ra

Quy trình được lưu trữ/UDF của bạn có tham số và bên trong Quy trình/UDF, tham số được gọi bằng tên chữ thường của nó, nhưng Snowflake đã tự động chuyển đổi tên thành chữ hoa.

Dung dịch

Either:

  • Sử dụng chữ hoa cho tên biến bên trong mã JavaScript hoặc

  • Đưa tên biến trong trích dẫn kép trong mã SQL.

Để biết thêm chi tiết, xem các đối số JavaScript và các giá trị được trả về.JavaScript Arguments and Returned Values.

Thủ tục lưu trữ không bao giờ kết thúc chạy

Gây ra

Quy trình được lưu trữ/UDF của bạn có tham số và bên trong Quy trình/UDF, tham số được gọi bằng tên chữ thường của nó, nhưng Snowflake đã tự động chuyển đổi tên thành chữ hoa.

Dung dịch

Sử dụng chữ hoa cho tên biến bên trong mã JavaScript hoặc

Đưa tên biến trong trích dẫn kép trong mã SQL.

Gây ra

Quy trình được lưu trữ/UDF của bạn có tham số và bên trong Quy trình/UDF, tham số được gọi bằng tên chữ thường của nó, nhưng Snowflake đã tự động chuyển đổi tên thành chữ hoa.

Dung dịch

Sử dụng chữ hoa cho tên biến bên trong mã JavaScript hoặc

Đưa tên biến trong trích dẫn kép trong mã SQL.

Gây ra

Quy trình được lưu trữ/UDF của bạn có tham số và bên trong Quy trình/UDF, tham số được gọi bằng tên chữ thường của nó, nhưng Snowflake đã tự động chuyển đổi tên thành chữ hoa.

Dung dịch

Sử dụng chữ hoa cho tên biến bên trong mã JavaScript hoặc