2009-03-26 33 views
15

Điều này rất giống với câu hỏi 653714, nhưng đối với MySQL thay vì SQL Server.MySQL Cách INSERT INTO [bảng tạm thời] TỪ [Quy trình đã lưu]

Về cơ bản, tôi có một lựa chọn phức tạp là cơ sở cho một số quy trình được lưu trữ. Tôi muốn chia sẻ mã trên các thủ tục được lưu trữ, tuy nhiên, tôi không chắc chắn làm thế nào để làm điều này. Một cách tôi có thể làm điều này là làm cho việc chia sẻ chọn một thủ tục được lưu trữ và sau đó gọi thủ tục được lưu trữ đó từ các thủ tục khác. Tôi không thể tìm ra cách làm việc với tập kết quả của thủ tục được lưu trữ lồng nhau. Nếu tôi có thể đặt chúng trong một bảng tạm thời tôi có thể sử dụng kết quả một cách hiệu quả, nhưng tôi không thể tìm ra cách để có được chúng trong một bảng tạm thời. Ví dụ: tính năng này không hoạt động:

CREATE TEMPORARY TABLE tmp EXEC nested_sp(); 

Trả lời

13

Vấn đề là, Thủ tục được lưu trữ không thực sự trả lại kết quả trực tiếp. Họ có thể thực hiện các câu lệnh chọn bên trong tập lệnh, nhưng không có giá trị trả về.

Cuộc gọi MySQL được lưu trữ thủ tục qua CALL StoredProcedureName(); Và bạn không thể chuyển hướng đầu ra đó đến bất cứ điều gì, vì chúng không trả về bất cứ điều gì (không giống như hàm).

MySQL Call Command

+0

Thử sử dụng truy vấn con nội tuyến – bobobobo

+14

Vì vậy, đây là câu trả lời? Giải pháp ở đâu? – Serge

+0

vì vậy điều này là không thể? – Samra

5

Phản ứng đầu tiên của tôi là "Nghe có vẻ như tôi". Không phải là trừu tượng nó đủ để bạn chỉ có thể thêm các biến đổi vào một SP cho mỗi trường hợp?

Bất cứ điều gì thêm bảng tạm thời mà không có cách nào khác là có một mô hình rất có khả năng.

4

tôi biết điều này đang đến rất trễ nhưng vì nó đã cho tôi lứa tuổi để tìm một giải pháp thực tế tôi cũng có thể chia sẻ. Tôi đã làm một ví dụ dưới đây.

các bảng được tạo ra là:

CREATE TABLE BOOK(
B_ID INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(B_ID), 
TITLE VARCHAR(100), 
DESCRIPTION VARCHAR(30), 
PRICE DOUBLE); 

CREATE TABLE BOOK_COMMENT(

PRIMARY KEY(B_C_ID), 
B_C_ID INT NOT NULL AUTO_INCREMENT, 
REMARK VARCHAR(120), 
B_ID INT, 
FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID)); 

CREATE TABLE AUTHOR(
A_ID INT NOT NULL AUTO_INCREMENT, 
PRIMARY KEY(A_ID), 
A_NAME CHAR(15), 
B_ID INT, 

FOREIGN KEY(B_ID) REFERENCES BOOK(B_ID)); 
  1. DELIMITER

CREATE PROCEDURE BOOK_IMPORTANT(_PRICE DOUBLE, _B_ID INT, A_NAME CHAR(15), _BD_ID INT) 

BEGIN 

INSERT INTO BOOK(PRICE) 

VALUES(_PRICE); 

SET _B_ID=LAST_INSERT_ID(); 

INSERT INTO BOOK_COMMENT(B_ID) 

VALUES(_B_ID); 

SET _BD_ID=LAST_INSERT_ID(); 

INSERT INTO AUTHOR(A_NAME,B_ID) 

VALUES(A_NAME,_BD_ID); 

END 

sau đó sử dụng sau đây để chèn các giá trị.

CALL BOOK_IMPORTANT('0.79',LAST_INSERT_ID(),'',LAST_INSERT_ID()); 

LAST_INSERT_ID() lấy mức tăng tự động cuối cùng của bảng và chèn nó vào cột tham chiếu của bảng con.

Trong tham số thủ tục _B_ID_BD_ID đại diện cho B_ID vì tôi cần B_ID làm khóa ngoại trong cả hai bảng.

Xin lỗi vì từ ngữ thừa. Tất cả những người khác đều mong bạn tự động biết cách làm điều đó. Hy vọng nó sẽ giúp

3

Bạn không thể "CHỌN INTO" với các thủ tục được lưu trữ.

Tạo bảng tạm thời trước và lưu thủ tục lưu trữ kết quả truy vấn vào bảng tạm thời được tạo bằng cách sử dụng "INSERT INTO" bình thường. Bảng tạm thời được hiển thị miễn là bạn thả nó hoặc cho đến khi kết nối được đóng lại.

Các vấn đề liên quan