Hướng dẫn call sql stored procedure from javascript - gọi thủ tục được lưu trữ sql từ javascript
Loại của Show
Bạn có thể tạo một điểm cuối là một trình bao bọc cho (các) quy trình được lưu trữ lấy tên thủ tục làm tham số, cũng như các tham số cho thủ tục. Khi bạn có một cơ chế như vậy, bạn có thể tạo các điểm cuối hiển thị các thủ tục một cách tự động. http://yourserver/services/yourprocname?prm1=val,prm2=val,etc Nếu bạn cảm thấy thực sự tham vọng, bạn có thể thử SQL 2016 và trả lại JSON trực tiếp từ các thủ tục đó. Sau đó, bạn có thể làm tổ dữ liệu bằng cách sử dụng các nhóm con và trả lại JSON trong một tải trọng duy nhất. Không tuần tự hóa, không có đối tượng, chỉ cần đọc dữ liệu và trả về nó. < 2016 you could put the results into a Dictionary and use NewtonSoft to serialize it. Assuming you are returning flat data you'd be good to go. Just use a reader and get the meta data from the column names for the key, and the value as object. NewtonSoft will convert that into JSON for you. Nếu bạn đang trả lại phân cấp, bạn có thể (theo quy ước) tạo ra một loạt các vận động viên đưa người đọc và bơm nó vào một từ điển trong đó đối tượng là một từ điển khác, công cụ Newtonoft sẽ giúp bạn tuần tự hóa. Hy vọng điều này sẽ giúp, chúng tôi đang sử dụng phương pháp này với năm 2016 và thật tuyệt khi có thể tạo một quy trình được lưu trữ và gọi nó mà không cần bất kỳ mã trung bình nào, triển khai, v.v. Nó chỉ hoạt động. Hi vọng điêu nay co ich. Các bước để gọi một thủ tục được lưu trữ tương tự như các bước để thực hiện truy vấn như sau:. 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, nhưng Blonflake không khuyên bạn nên làm điều này.CALL (with Anonymous Procedure). Creating and calling an anonymous procedure does not require a role with CREATE PROCEDURE schema privileges. 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.Tạo quy trình được lưu trữ quyền của chủ sở hữu sử dụng biến phiên: Gọi thủ tục (nó sẽ thất bại):
Mã lỗi.
Các đối tượng này được mô tả chi tiết trong API quy trình lưu trữ JavaScript.JavaScript Stored Procedures API. Một quy trình được lưu trữ điển hình chứa mã tương tự như mã giả 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(); Mã này sử dụng một đối tượng có tên CREATE OR REPLACE PROCEDURE right_bind(TIMESTAMP_VALUE VARCHAR) RETURNS BOOLEAN LANGUAGE JAVASCRIPT AS $$ var cmd = "SELECT CURRENT_DATE() > TO_TIMESTAMP(:1, 'YYYY-MM-DD HH24:MI:SS')"; var stmt = snowflake.createStatement( { sqlText: cmd, binds: [TIMESTAMP_VALUE] } ); var result1 = stmt.execute(); result1.next(); return result1.getColumnValue(1); $$ ;0, đây là một đối tượng đặc biệt tồn tại mà không được khai báo. Đối tượng được cung cấp bên trong bối cảnh của từng quy trình được lưu trữ và hiển thị API để cho phép bạn tương tác với máy chủ. Các biến khác (ví dụ: CREATE OR REPLACE PROCEDURE right_bind(TIMESTAMP_VALUE VARCHAR) RETURNS BOOLEAN LANGUAGE JAVASCRIPT AS $$ var cmd = "SELECT CURRENT_DATE() > TO_TIMESTAMP(:1, 'YYYY-MM-DD HH24:MI:SS')"; var stmt = snowflake.createStatement( { sqlText: cmd, binds: [TIMESTAMP_VALUE] } ); var result1 = stmt.execute(); result1.next(); return result1.getColumnValue(1); $$ ;6) được tạo bằng các câu lệnh JavaScript CREATE OR REPLACE PROCEDURE right_bind(TIMESTAMP_VALUE VARCHAR) RETURNS BOOLEAN LANGUAGE JAVASCRIPT AS $$ var cmd = "SELECT CURRENT_DATE() > TO_TIMESTAMP(:1, 'YYYY-MM-DD HH24:MI:SS')"; var stmt = snowflake.createStatement( { sqlText: cmd, binds: [TIMESTAMP_VALUE] } ); var result1 = stmt.execute(); result1.next(); return result1.getColumnValue(1); $$ ;7. Ví dụ: Như được hiển thị trong mẫu mã ở trên, đối tượng CREATE OR REPLACE PROCEDURE right_bind(TIMESTAMP_VALUE VARCHAR) RETURNS BOOLEAN LANGUAGE JAVASCRIPT AS $$ var cmd = "SELECT CURRENT_DATE() > TO_TIMESTAMP(:1, 'YYYY-MM-DD HH24:MI:SS')"; var stmt = snowflake.createStatement( { sqlText: cmd, binds: [TIMESTAMP_VALUE] } ); var result1 = stmt.execute(); result1.next(); return result1.getColumnValue(1); $$ ;0 cho phép bạn tạo đối tượng CREATE OR REPLACE PROCEDURE right_bind(TIMESTAMP_VALUE VARCHAR) RETURNS BOOLEAN LANGUAGE JAVASCRIPT AS $$ var cmd = "SELECT CURRENT_DATE() > TO_TIMESTAMP(:1, 'YYYY-MM-DD HH24:MI:SS')"; var stmt = snowflake.createStatement( { sqlText: cmd, binds: [TIMESTAMP_VALUE] } ); var result1 = stmt.execute(); result1.next(); return result1.getColumnValue(1); $$ ;1 bằng cách gọi một trong các phương thức trong API. Dưới đây, một ví dụ lấy lại CREATE OR REPLACE PROCEDURE right_bind(TIMESTAMP_VALUE VARCHAR) RETURNS BOOLEAN LANGUAGE JAVASCRIPT AS $$ var cmd = "SELECT CURRENT_DATE() > TO_TIMESTAMP(:1, 'YYYY-MM-DD HH24:MI:SS')"; var stmt = snowflake.createStatement( { sqlText: cmd, binds: [TIMESTAMP_VALUE] } ); var result1 = stmt.execute(); result1.next(); return result1.getColumnValue(1); $$ ;3 và lặp lại thông qua nó: 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. $$ ; Phần ví dụ (ở cuối chủ đề này) cung cấp các ví dụ bổ sung rằng thực hiện từng đối tượng và nhiều phương pháp, trong quy trình được lưu trữ API JavaScript.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. Ánh xạ kiểu dữ liệu SQL và JavaScriptKhi gọi, sử dụng và nhận lại các giá trị từ các quy trình được lưu trữ, bạn thường cần chuyển đổi từ kiểu dữ liệu SQL của Snowflake sang kiểu dữ liệu JavaScript hoặc ngược lại. Chuyển đổi SQL sang JavaScript có thể xảy ra khi:
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ừ CREATE OR REPLACE PROCEDURE right_bind(TIMESTAMP_VALUE VARCHAR) RETURNS BOOLEAN LANGUAGE JAVASCRIPT AS $$ var cmd = "SELECT CURRENT_DATE() > TO_TIMESTAMP(:1, 'YYYY-MM-DD HH24:MI:SS')"; var stmt = snowflake.createStatement( { sqlText: cmd, binds: [TIMESTAMP_VALUE] } ); var result1 = stmt.execute(); result1.next(); return result1.getColumnValue(1); $$ ;3 vào biến JavaScript, biến JavaScript phải thuộc loại 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. $$ ;02. 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 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. $$ ;05. 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ị 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ộcKhi 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:
Để 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.Binding Variables. Mẹo chung¶Tiếp tục dòngCá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:
Cân nhắc thủ tục lưu trữ JavaScriptPhạm vi số JavaScriptPhạm vi cho các số có chính xác còn nguyên vẹn là từ
đến
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ụ: 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 | +----------------------+----------------------+------------+ 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ữ. Nếu bạn gặp vấn đề trong các quy trình được lưu trữ khi sử dụ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. $$ ;20, bạn có thể tránh được vấn đề bằng cách lấy một giá trị dưới dạng chuỗi, ví dụ: với: 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 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. $$ ;22 ở trường hợp thường. 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 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. $$ ;23 hoặc dấu hiệu đô la kép 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. $$ ;24. Sử dụ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. $$ ;24 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 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. $$ ;26. 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: 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 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ữ: var sql_command = "SELECT * \ FROM table1;";4var sql_command = "SELECT * \ FROM table1;";5var sql_command = "SELECT * \ FROM table1;";6var sql_command = "SELECT * \ FROM table1;";7 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.
Bắt lỗi bằng cách sử dụng thử/Catch¶Ví dụ này thể hiện bằng cách sử dụng khối thử/bắt JavaScript để bắt lỗi trong quy trình được lưu trữ:
Ví dụ sau đây cho thấy việc ném một ngoại lệ tùy chỉnh:
Ví dụ sau đây cho thấy việc ném một ngoại lệ tùy chỉnh:Gọi thủ tục được lưu trữ với các giá trị hợp lệ và không hợp lệ: var sql_command = `SELECT * FROM table1;`;5 Sử dụng các giao dịch trong các thủ tục lưu trữ lorVí dụ sau đây bao gồm nhiều câu lệnh liên quan trong một giao dịch và sử dụng thử/bắt để cam kết hoặc quay lại. Tham 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. $$ ;37 cho phép người gọi lựa chọn giữa thực thi thành công và lỗi có chủ ý. var sql_command = `SELECT * FROM table1;`;6var sql_command = `SELECT * FROM table1;`;7var sql_command = `SELECT * FROM table1;`;8
Đăng nhập một lỗiVí dụ sau đây nhật ký lỗi vào bảng. Trong một ví dụ thực tế hơn, có lẽ bạn cũng sẽ bao gồm dấu thời gian của thời gian xảy ra lỗi (sử dụng hàm 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. $$ ;38). Đăng nhập lỗi (phiên bản 2) ¶
Gọi thủ tục: Kiểm tra xem bảng có được tạo không và các tin nhắn đã được ghi lại: 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.Naming Conventions for Stored Procedures (in this topic), you can overload stored procedure names. For example:
Tiếp theo, hãy gọi hai thủ tục: var sql_command = "SELECT col1, col2" sql_command += " FROM table1" sql_command += " WHERE col1 >= 100" sql_command += " ORDER BY col2;"5 Ghi chú
Bây giờ, hãy tạo một quy trình được lưu trữ quá tải có tham số Varchar: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 đó.RESULT_SCAN function to retrieve the result from a CALL statement:
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: 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:
Ở đâ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): select hash(1) AS a, num_test(hash(1)) AS b, a - b; +----------------------+----------------------+------------+ | A | B | A - B | |----------------------+----------------------+------------| | -4730168494964875235 | -4730168494964875000 | -235.00000 | +----------------------+----------------------+------------+6select hash(1) AS a, num_test(hash(1)) AS b, a - b; +----------------------+----------------------+------------+ | A | B | A - B | |----------------------+----------------------+------------| | -4730168494964875235 | -4730168494964875000 | -235.00000 | +----------------------+----------------------+------------+7 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: select hash(1) AS a, num_test(hash(1)) AS b, a - b; +----------------------+----------------------+------------+ | A | B | A - B | |----------------------+----------------------+------------| | -4730168494964875235 | -4730168494964875000 | -235.00000 | +----------------------+----------------------+------------+8select hash(1) AS a, num_test(hash(1)) AS b, a - b; +----------------------+----------------------+------------+ | A | B | A - B | |----------------------+----------------------+------------| | -4730168494964875235 | -4730168494964875000 | -235.00000 | +----------------------+----------------------+------------+9CREATE PROCEDURE f(argument1 VARCHAR) RETURNS VARCHAR LANGUAGE JAVASCRIPT AS $$ var local_variable1 = argument1; // Incorrect var local_variable2 = ARGUMENT1; // Correct $$;0 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, nhưng Blonflake 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.
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:Xử lý sự cố¶
Stack theo dõi tại điểm thất bại.Catching an Error using Try/Catch (in this topic). Để 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). 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.Either:
Đưa tên biến trong trích dẫn kép trong mã SQL.JavaScript Arguments and Returned Values. Để biết thêm chi tiết, xem các đối số JavaScript và các giá trị được trả về.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 Sử dụng chữ hoa cho tên biến bên trong mã JavaScript hoặcQuy 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 Sử dụng chữ hoa cho tên biến bên trong mã JavaScript hoặcQuy 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 Tôi có thể chạy truy vấn SQL với JavaScript không?Trường hợp sử dụng điển hình để thực thi SQL từ JavaScript là cập nhật trạng thái thực thi vào thời gian chạy trong luồng lồng phức hoặc để lưu các bản ghi bị từ chối bởi xác thực vào bảng lỗi.
Làm thế nào để bạn gọi một thủ tục được lưu trữ với các tham số trong Node JS?Các bước để gọi một thủ tục được lưu trữ tương tự như các bước để thực hiện truy vấn như sau:.. Kết nối với máy chủ cơ sở dữ liệu MySQL .. Gọi thủ tục được lưu trữ bằng cách thực hiện câu lệnh CALL SPNAME.Tên gọi là tên của thủ tục được lưu trữ .. Đóng kết nối cơ sở dữ liệu .. Làm thế nào để bạn thực hiện một thủ tục được lưu trữ?Mở rộng cơ sở dữ liệu mà bạn muốn, mở rộng khả năng lập trình và sau đó mở rộng các quy trình được lưu trữ.Nhấp chuột phải vào quy trình được lưu trữ do người dùng xác định mà bạn muốn và chọn thực thi thủ tục được lưu trữ.Trong hộp thoại Quy trình thực thi, chỉ định giá trị cho từng tham số và liệu nó có nên truyền giá trị null hay không.Right-click the user-defined stored procedure that you want and select Execute Stored Procedure. In the Execute Procedure dialog box, specify a value for each parameter and whether it should pass a null value.
Làm thế nào để bạn gọi một thủ tục trong một quy trình trong SQL Server?Bước 1: Tạo hai quy trình được lưu trữ đơn giản để chèn một số dữ liệu vào hai bảng khác nhau ... usp_insert_into_log1 để chèn dữ liệu vào tbl_log1 .. usp_insert_into_log2 để chèn dữ liệu vào tbl_log2 .. Cả hai chấp nhận bốn tham số để chèn dữ liệu .. |