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.
Kiểm tra và sửa bất kỳ vòng lặp vô hạn.Lỗi: ________ 149¶ NoSQLQuy 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
Bài viết10/12/2022
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).
Chủ đề này giải thích cách viết mã JavaScript cho một thủ tục được lưu trữ.
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.
Chuyển đổi JavaScript sang SQL có thể xảy ra khi:
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:
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:
SỰ VẬTChuyể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
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
Tích lũy chuỗi. Ví dụ:Cân nhắc thủ tục lưu trữ JavaScriptPhạm vi số JavaScript
-(2^53 -1)
(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 JavaScriptVì 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ữ JoCác thủ tục được lưu trữ có các hạn chế sau:
Độ nhạy của trường hợp trong các đối số JavaScriptTê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 JAVASCRIPTPhầ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ộcLiê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 ():
Đ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.
Để 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 lorHầ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 độngCá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ảnVí 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 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ữ:
Ví dụ sau lấy kết quả:
Ví dụ về thủ tục lưu trữ đệ quy OrVí 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. $$ ;5create 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. $$ ;6create 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. $$ ;7create 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 SQLVí 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.
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):
Ví dụ về thủ tục lưu trữ đệ quy Or
Ví dụ về thủ tục lưu trữ đệ quy OrVí 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 SQLVí dụ sau đây cho thấy cách tạo tự động câu lệnh SQL: var sql_command = "SELECT * \ FROM table1;";7var sql_command = "SELECT * \ FROM table1;";8var 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):
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ênNhư đượ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:
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ờ:
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:
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:
Ở đây, khoảng cùng một mã, nhưng trong các bước nhỏ hơn:
Trả về một mảng các thông báo lỗiQuy 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; $$ ;7CREATE 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; $$ ;9select hash(1) AS a, num_test(hash(1)) AS b, a - b; +----------------------+----------------------+------------+ | A | B | A - B | |----------------------+----------------------+------------| | -4730168494964875235 | -4730168494964875000 | -235.00000 | +----------------------+----------------------+------------+0select hash(1) AS a, num_test(hash(1)) AS b, a - b; +----------------------+----------------------+------------+ | A | B | A - B | |----------------------+----------------------+------------| | -4730168494964875235 | -4730168494964875000 | -235.00000 | +----------------------+----------------------+------------+1 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:
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.
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ữuNhữ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:
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ọiVí dụ sau đây cho thấy một thủ tục được lưu trữ quyền của người gọi.
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ềnVí dụ sau đây cho thấy một thủ tục được lưu trữ quyền của chủ sở hữu.
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:
Để 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 raQuy 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ịchEither:
Để 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ạyGây raQuy 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ịchSử 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 raQuy 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ịchSử 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 raQuy 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ịchSử dụng chữ hoa cho tên biến bên trong mã JavaScript hoặc |