Tôi không thể tìm thấy câu trả lời này ở bất cứ đâu, nhưng bạn có thể gọi một quy trình được lưu trữ từ một quy trình được lưu trữ khác trong MySQL không? Tôi muốn lấy lại giá trị nhận dạng và sử dụng nó trong quy trình lưu trữ của cha mẹ. Chúng tôi không thể sử dụng các chức năng nữa!
Đã hỏi ngày 12 tháng 6 năm 2012 lúc 16:27Jun 12, 2012 at 16:27
Mike Flynnmike FlynnMike Flynn
22K51 Huy hiệu vàng176 Huy hiệu bạc330 Huy hiệu Đồng51 gold badges176 silver badges330 bronze badges
CREATE PROCEDURE innerproc[OUT param1 INT]
BEGIN
insert into sometable;
SELECT LAST_INSERT_ID[] into param1 ;
END
-----------------------------------
CREATE PROCEDURE outerproc[]
BEGIN
CALL innerproc[@a];
// @a gives you the result of innerproc
SELECT @a INTO variableinouterproc FROM dual;
END
Các tham số OUT
sẽ giúp bạn đưa các giá trị trở lại quy trình gọi. Dựa trên đó, giải pháp phải là một cái gì đó như thế này.
Đã trả lời ngày 12 tháng 6 năm 2012 lúc 16:34Jun 12, 2012 at 16:34
Ahamed mustafa mahamed mustafa mAhamed Mustafa M
3.0391 Huy hiệu vàng22 Huy hiệu bạc33 Huy hiệu đồng1 gold badge22 silver badges33 bronze badges
5
Để gọi một thủ tục khác, hãy sử dụng cuộc gọi: Ex: Call SP1[parm1, parm2];
Để có được danh tính, bạn đã thử kiểm tra last_insert_id []; Bạn sẽ làm một cái gì đó như SELECT LAST_INSERT_ID[]
sau cuộc gọi SP của bạn.
Đây là một ví dụ hoàn chỉnh, được thử nghiệm:
DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
Đã trả lời ngày 12 tháng 6 năm 2012 lúc 16:31Jun 12, 2012 at 16:31
4
13.2.1 & NBSP; Câu lệnh gọi
CALL sp_name[[parameter[,...]]]
CALL sp_name[[]]
Tuyên bố CALL
gọi một quy trình được lưu trữ được xác định trước đó với
DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
0.Các thủ tục được lưu trữ không có đối số nào có thể được gọi mà không có dấu ngoặc đơn. Đó là,
DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
1 và DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
2 là tương đương. CALL
có thể chuyển các giá trị trở lại cho người gọi bằng các tham số được khai báo là OUT
hoặc
DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
5 tham số. Khi thủ tục trả về, một chương trình máy khách cũng có thể thu được số lượng hàng bị ảnh hưởng cho câu lệnh cuối cùng được thực thi trong thói quen: ở cấp SQL, hãy gọi hàm DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
6; Từ API C, hãy gọi hàm DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
7.Để biết thông tin về ảnh hưởng của các điều kiện chưa được xử lý đối với các tham số thủ tục, xem Phần & NBSP; 13.6.7.8, Xử lý điều kiện và ra các tham số hoặc ra các tham số.
Để lấy lại giá trị từ một thủ tục bằng tham số OUT
hoặc
DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
5, hãy truyền tham số bằng biến người dùng, sau đó kiểm tra giá trị của biến sau khi thủ tục trả về. . Quy trình sau đây có tham số OUT
mà quy trình đặt thành phiên bản máy chủ hiện tại và giá trị DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
5 mà quy trình tăng lên từ giá trị hiện tại của nó:CREATE PROCEDURE p [OUT ver_param VARCHAR[25], INOUT incr_param INT]
BEGIN
# Set value of OUT parameter
SELECT VERSION[] INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
Trước khi gọi quy trình, khởi tạo biến sẽ được truyền dưới dạng tham số
DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
5. Sau khi gọi thủ tục, bạn có thể thấy rằng các giá trị của hai biến được đặt hoặc sửa đổi:mysql> SET @increment = 10;
mysql> CALL p[@version, @increment];
mysql> SELECT @version, @increment;
+--------------------+------------+
| @version | @increment |
+--------------------+------------+
| 8.0.3-rc-debug-log | 11 |
+--------------------+------------+
Trong các câu lệnh CALL
được sử dụng với
CALL sp_name[[parameter[,...]]]
CALL sp_name[[]]
7 và CALL sp_name[[parameter[,...]]]
CALL sp_name[[]]
8, các giữ chỗ có thể được sử dụng cho các tham số CALL sp_name[[parameter[,...]]]
CALL sp_name[[]]
0, OUT
và DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
5 tham số. Các loại tham số này có thể được sử dụng như sau:mysql> SET @increment = 10;
mysql> PREPARE s FROM 'CALL p[?, ?]';
mysql> EXECUTE s USING @version, @increment;
mysql> SELECT @version, @increment;
+--------------------+------------+
| @version | @increment |
+--------------------+------------+
| 8.0.3-rc-debug-log | 11 |
+--------------------+------------+
Để viết các chương trình C sử dụng câu lệnh CALL
SQL để thực hiện các quy trình được lưu trữ tạo ra các bộ kết quả, cờ
CREATE PROCEDURE p [OUT ver_param VARCHAR[25], INOUT incr_param INT]
BEGIN
# Set value of OUT parameter
SELECT VERSION[] INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
3 phải được bật. Điều này là do mỗi CALL
trả về kết quả để chỉ ra trạng thái cuộc gọi, ngoài bất kỳ bộ kết quả nào có thể được trả về bởi các câu lệnh được thực thi trong quy trình. CREATE PROCEDURE p [OUT ver_param VARCHAR[25], INOUT incr_param INT]
BEGIN
# Set value of OUT parameter
SELECT VERSION[] INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
3 cũng phải được bật nếu CALL
được sử dụng để thực hiện bất kỳ quy trình được lưu trữ nào có chứa các câu lệnh đã chuẩn bị. Không thể xác định được khi một thủ tục như vậy được tải cho dù các câu lệnh đó tạo ra các bộ kết quả, vì vậy cần phải cho rằng họ làm như vậy.
CREATE PROCEDURE p [OUT ver_param VARCHAR[25], INOUT incr_param INT]
BEGIN
# Set value of OUT parameter
SELECT VERSION[] INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
3 có thể được bật khi bạn gọi CREATE PROCEDURE p [OUT ver_param VARCHAR[25], INOUT incr_param INT]
BEGIN
# Set value of OUT parameter
SELECT VERSION[] INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
8, rõ ràng bằng cách vượt qua cờ CREATE PROCEDURE p [OUT ver_param VARCHAR[25], INOUT incr_param INT]
BEGIN
# Set value of OUT parameter
SELECT VERSION[] INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
3 hoặc hoàn toàn bằng cách vượt qua mysql> SET @increment = 10;
mysql> CALL p[@version, @increment];
mysql> SELECT @version, @increment;
+--------------------+------------+
| @version | @increment |
+--------------------+------------+
| 8.0.3-rc-debug-log | 11 |
+--------------------+------------+
0 [cũng cho phép CREATE PROCEDURE p [OUT ver_param VARCHAR[25], INOUT incr_param INT]
BEGIN
# Set value of OUT parameter
SELECT VERSION[] INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
3]. CREATE PROCEDURE p [OUT ver_param VARCHAR[25], INOUT incr_param INT]
BEGIN
# Set value of OUT parameter
SELECT VERSION[] INTO ver_param;
# Increment value of INOUT parameter
SET incr_param = incr_param + 1;
END;
3 được bật theo mặc định. Để xử lý kết quả của câu lệnh CALL
được thực thi bằng cách sử dụng
mysql> SET @increment = 10;
mysql> CALL p[@version, @increment];
mysql> SELECT @version, @increment;
+--------------------+------------+
| @version | @increment |
+--------------------+------------+
| 8.0.3-rc-debug-log | 11 |
+--------------------+------------+
4 hoặc mysql> SET @increment = 10;
mysql> CALL p[@version, @increment];
mysql> SELECT @version, @increment;
+--------------------+------------+
| @version | @increment |
+--------------------+------------+
| 8.0.3-rc-debug-log | 11 |
+--------------------+------------+
5, hãy sử dụng một vòng lặp gọi mysql> SET @increment = 10;
mysql> CALL p[@version, @increment];
mysql> SELECT @version, @increment;
+--------------------+------------+
| @version | @increment |
+--------------------+------------+
| 8.0.3-rc-debug-log | 11 |
+--------------------+------------+
6 để xác định xem có nhiều kết quả hơn không. Ví dụ, xem hỗ trợ thực thi nhiều câu lệnh. Các chương trình C có thể sử dụng giao diện đã chuẩn bị để thực hiện các câu lệnh CALL
và truy cập các tham số OUT
và
DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
5. Điều này được thực hiện bằng cách xử lý kết quả của câu lệnh CALL
bằng cách sử dụng vòng lặp gọi mysql> SET @increment = 10;
mysql> PREPARE s FROM 'CALL p[?, ?]';
mysql> EXECUTE s USING @version, @increment;
mysql> SELECT @version, @increment;
+--------------------+------------+
| @version | @increment |
+--------------------+------------+
| 8.0.3-rc-debug-log | 11 |
+--------------------+------------+
1 để xác định xem có nhiều kết quả hơn không. Ví dụ, xem hỗ trợ câu lệnh gọi đã chuẩn bị. Các ngôn ngữ cung cấp giao diện MySQL có thể sử dụng các câu lệnh CALL
để truy xuất trực tiếp các tham số thủ tục OUT
và DELIMITER $$
CREATE TABLE animals [
id MEDIUMINT NOT NULL AUTO_INCREMENT,
name CHAR[30] NOT NULL,
PRIMARY KEY [id]
] $$
CREATE PROCEDURE sp1[]
BEGIN
insert into animals [name] values ['bear'];
END $$
CREATE PROCEDURE sp2[]
BEGIN
call sp1;
select last_insert_id[];
END $$
call sp2;
5.Các thay đổi siêu dữ liệu đối với các đối tượng được đề cập bởi các chương trình được lưu trữ được phát hiện và gây ra tự động lặp lại các câu lệnh bị ảnh hưởng khi chương trình được thực hiện tiếp theo. Để biết thêm thông tin, hãy xem Phần & NBSP; 8.10.3, Bộ nhớ đệm của các câu lệnh đã chuẩn bị và các chương trình được lưu trữ.