ขั้นตอนการจัดเก็บคืออะไร?


298

"ขั้นตอนการจัดเก็บ"คืออะไรและทำงานอย่างไร

การแต่งหน้าของกระบวนงานที่เก็บไว้คืออะไร (สิ่งที่แต่ละอย่างจะต้องเป็นขั้นตอนการจัดเก็บ)

คำตอบ:


243

กระบวนงานที่เก็บเป็นชุดของคำสั่ง SQL ที่สามารถดำเนินการได้สองวิธี DBM สำคัญส่วนใหญ่สนับสนุนการจัดเก็บ; อย่างไรก็ตามไม่ได้ทำทั้งหมด คุณจะต้องตรวจสอบกับเอกสารช่วยเหลือของ DBMS เฉพาะสำหรับข้อมูลเฉพาะ เนื่องจากฉันคุ้นเคยกับ SQL Server มากที่สุดฉันจะใช้มันเป็นตัวอย่างของฉัน

ในการสร้างโพรซีเดอร์ที่เก็บไว้ไวยากรณ์นั้นค่อนข้างง่าย:

CREATE PROCEDURE <owner>.<procedure name>

     <Param> <datatype>

AS

     <Body>

ตัวอย่างเช่น:

CREATE PROCEDURE Users_GetUserInfo

    @login nvarchar(30)=null

AS

    SELECT * from [Users]
    WHERE ISNULL(@login,login)=login

ข้อดีของขั้นตอนการจัดเก็บคือคุณสามารถรวมศูนย์ตรรกะการเข้าถึงข้อมูลไว้ในที่เดียวซึ่งง่ายสำหรับ DBA ในการเพิ่มประสิทธิภาพ กระบวนงานที่เก็บไว้ยังมีประโยชน์ด้านความปลอดภัยซึ่งคุณสามารถให้สิทธิ์ดำเนินการกับกระบวนงานที่เก็บไว้ได้ แต่ผู้ใช้ไม่จำเป็นต้องมีสิทธิ์อ่าน / เขียนบนตารางต้นแบบ นี่เป็นขั้นตอนแรกที่ดีสำหรับการฉีด SQL

ขั้นตอนการจัดเก็บจะมาพร้อมกับข้อเสียโดยทั่วไปการบำรุงรักษาที่เกี่ยวข้องกับการดำเนินงานCRUDขั้นพื้นฐานของคุณ สมมติว่าแต่ละตารางคุณมีการแทรกอัปเดตลบและเลือกอย่างน้อยหนึ่งรายการตามคีย์หลักนั่นหมายความว่าแต่ละตารางจะมี 4 ขั้นตอน ตอนนี้ใช้ฐานข้อมูลขนาดที่เหมาะสม 400 ตารางและคุณมี 1600 ขั้นตอน! และนั่นคือสมมุติว่าคุณไม่มีข้อมูลซ้ำที่คุณอาจต้องการ

นี่คือที่ใช้ORMหรือวิธีอื่นเพื่อสร้างการดำเนินงาน CRUD ขั้นพื้นฐานของคุณโดยอัตโนมัติมีข้อดีมากมาย


1
คุณหมายถึงขั้นตอนการเก็บข้อมูลในการอ่านและORMชอบEntity Frameworkที่จะทำCRUDการดำเนินงาน?
shaijut

2
ใช่ว่าเป็นวิธีหนึ่งที่เป็นไปได้ เราใช้ ORM สำหรับทุกสิ่งยกเว้นรายงาน
JoshBerke

สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับขั้นตอนการจัดเก็บคุณสามารถอ้างถึง URL ของฉันtechflirt.com/mysql-stored-procedure-tutorial
Ankur Kumar Singh

150

กระบวนงานที่เก็บไว้เป็นชุดของคำสั่ง SQL ที่คอมไพล์แล้วที่ใช้ในการทำงานพิเศษ

ตัวอย่าง: ถ้าฉันมีEmployeeตาราง

Employee ID  Name       Age  Mobile
---------------------------------------
001          Sidheswar  25   9938885469
002          Pritish    32   9178542436

ก่อนอื่นฉันจะดึงEmployeeตาราง:

Create Procedure Employee details
As
Begin
    Select * from Employee
End

ในการรันโพรซีเดอร์บน SQL Server:

Execute   Employee details

--- (Employee details is a user defined name, give a name as you want)

จากนั้นข้อที่สองฉันใส่ค่าลงในตารางพนักงาน

Create Procedure employee_insert
    (@EmployeeID int, @Name Varchar(30), @Age int, @Mobile int)
As
Begin
    Insert Into Employee
    Values (@EmployeeID, @Name, @Age, @Mobile)
End

ในการรันโพรซีเดอร์ที่เป็นพารามิเตอร์บน SQL Server:

Execute employee_insert 003,’xyz’,27,1234567890

  --(Parameter size must be same as declared column size)

ตัวอย่าง: @Name Varchar(30)

ในEmployeeตารางขนาดของคอลัมน์ต้องNamevarchar(30)


1
ตัวอย่างที่เข้าใจง่าย
HaFiz Umer

80

กระบวนงานที่เก็บไว้เป็นกลุ่มของคำสั่ง SQL ที่ถูกสร้างขึ้นและเก็บไว้ในฐานข้อมูล โพรซีเดอร์ที่เก็บไว้จะยอมรับพารามิเตอร์อินพุตเพื่อให้โพรซีเดอร์เดี่ยวสามารถใช้ผ่านเครือข่ายโดยไคลเอนต์หลายรายโดยใช้ข้อมูลอินพุตที่แตกต่างกัน โพรซีเดอร์ที่เก็บไว้จะลดทราฟฟิกเครือข่ายและเพิ่มประสิทธิภาพ หากเราแก้ไขขั้นตอนการจัดเก็บลูกค้าทั้งหมดจะได้รับขั้นตอนการจัดเก็บที่ปรับปรุง

ตัวอย่างการสร้างกระบวนงานที่เก็บไว้

CREATE PROCEDURE test_display
AS
    SELECT FirstName, LastName
    FROM tb_test;

EXEC test_display;

ข้อดีของการใช้กระบวนงานที่เก็บไว้

  • ขั้นตอนการจัดเก็บช่วยให้การเขียนโปรแกรมแบบแยกส่วน

    คุณสามารถสร้างโพรซีเดอร์ได้หนึ่งครั้งเก็บไว้ในฐานข้อมูลและเรียกมันว่าจำนวนครั้งใด ๆ ในโปรแกรมของคุณ

  • ขั้นตอนการจัดเก็บช่วยให้ดำเนินการได้เร็วขึ้น

    หากการดำเนินการต้องการรหัส SQL จำนวนมากที่ทำซ้ำขั้นตอนการจัดเก็บอาจเร็วขึ้น พวกเขาจะถูกแยกวิเคราะห์และปรับให้เหมาะสมเมื่อพวกเขาถูกดำเนินการครั้งแรกและรุ่นที่รวบรวมของขั้นตอนการจัดเก็บยังคงอยู่ในแคชหน่วยความจำสำหรับใช้ในภายหลัง ซึ่งหมายความว่าขั้นตอนการจัดเก็บไม่จำเป็นต้องทำการแยกวิเคราะห์ซ้ำและนำกลับมาใช้ใหม่ในแต่ละครั้งซึ่งจะส่งผลให้เวลาในการประมวลผลเร็วขึ้นมาก

  • ขั้นตอนการจัดเก็บสามารถลดปริมาณการใช้เครือข่าย

    การดำเนินการที่ต้องการโค้ด Transact-SQL หลายร้อยบรรทัดสามารถดำเนินการผ่านคำสั่งเดียวที่เรียกใช้งานโค้ดในโพรซีเดอร์แทนที่จะส่งโค้ดหลายร้อยบรรทัดผ่านเครือข่าย

  • ขั้นตอนการจัดเก็บให้ความปลอดภัยกับข้อมูลของคุณดีขึ้น

    ผู้ใช้สามารถได้รับอนุญาตให้ดำเนินการขั้นตอนการจัดเก็บแม้ว่าพวกเขาจะไม่ได้รับอนุญาตให้ดำเนินการตามคำสั่งของขั้นตอนโดยตรง

    ใน SQL Server เรามีวิธีการเก็บประเภทต่าง ๆ :

    • ขั้นตอนการจัดเก็บระบบ
    • ขั้นตอนการจัดเก็บที่ผู้ใช้กำหนด
    • ขยายกระบวนงานที่เก็บไว้
  • กระบวนงานที่เก็บไว้ในระบบจะถูกเก็บไว้ในฐานข้อมูลหลักและเริ่มต้นด้วยส่วนsp_นำหน้า ขั้นตอนเหล่านี้สามารถใช้เพื่อทำงานที่หลากหลายเพื่อรองรับฟังก์ชั่น SQL Server สำหรับการเรียกใช้แอปพลิเคชันภายนอกในตารางระบบ

    ตัวอย่าง: sp_helptext [StoredProcedure_Name]

  • โดยทั่วไปขั้นตอนการจัดเก็บที่ผู้ใช้กำหนดจะถูกเก็บไว้ในฐานข้อมูลผู้ใช้และโดยทั่วไปแล้วได้รับการออกแบบเพื่อให้งานในฐานข้อมูลผู้ใช้เสร็จสมบูรณ์ ในขณะที่การเข้ารหัสขั้นตอนเหล่านี้ไม่ได้ใช้sp_คำนำหน้าเพราะถ้าเราจะใช้sp_คำนำหน้าแรกก็จะตรวจสอบฐานข้อมูลหลักและแล้วก็มาถึงฐานข้อมูลที่ผู้ใช้กำหนด

  • ขั้นตอนการจัดเก็บขยายเป็นกระบวนการที่เรียกใช้ฟังก์ชันจากไฟล์ DLL ทุกวันนี้โพรซีเดอร์ที่เก็บแบบขยายถูกเลิกใช้เนื่องจากเหตุผลที่ดีกว่าที่จะหลีกเลี่ยงการใช้โพรซีเดอร์ที่เก็บแบบขยาย


37

โดยทั่วไปกระบวนงานที่เก็บไว้เป็น "ฟังก์ชัน SQL" พวกเขามี:

-- a name
CREATE PROCEDURE spGetPerson
-- parameters
CREATE PROCEDURE spGetPerson(@PersonID int)
-- a body
CREATE PROCEDURE spGetPerson(@PersonID int)
AS
SELECT FirstName, LastName ....
FROM People
WHERE PersonID = @PersonID

นี่คือตัวอย่างที่เน้น T-SQL กระบวนงานที่เก็บไว้สามารถดำเนินการคำสั่ง SQL ส่วนใหญ่ส่งคืนค่าสเกลาร์และค่าที่อิงกับตารางและได้รับการพิจารณาว่ามีความปลอดภัยมากกว่าเนื่องจากป้องกันการโจมตีจากการฉีด SQL


16

คิดถึงสถานการณ์เช่นนี้

  • คุณมีฐานข้อมูลพร้อมข้อมูล
  • มีแอปพลิเคชั่นที่แตกต่างกันจำนวนมากที่จำเป็นในการเข้าถึงฐานข้อมูลกลางนั้นและในอนาคตแอปพลิเคชั่นใหม่ก็มีเช่นกัน
  • หากคุณกำลังจะแทรกการสืบค้นฐานข้อมูลแบบอินไลน์เพื่อเข้าถึงฐานข้อมูลกลางภายในรหัสของแต่ละแอปพลิเคชันแล้วคุณอาจต้องทำซ้ำแบบสอบถามเดียวกันซ้ำแล้วซ้ำอีกในรหัสแอปพลิเคชันอื่น
  • ในสถานการณ์แบบนั้นคุณสามารถใช้กระบวนงานที่เก็บไว้ (SPs) ด้วยโพรซีเดอร์ที่เก็บคุณกำลังเขียนจำนวนเคียวรีทั่วไป (โพรซีเดอร์) และเก็บไว้กับฐานข้อมูลกลาง
  • ตอนนี้การทำซ้ำของงานจะไม่เกิดขึ้นเหมือนเดิมและการเข้าถึงข้อมูลและการบำรุงรักษาจะทำจากส่วนกลาง

บันทึก:

  • ในสถานการณ์ข้างต้นคุณอาจสงสัยว่า "ทำไมเราไม่สามารถแนะนำเซิร์ฟเวอร์การเข้าถึงข้อมูลส่วนกลางเพื่อโต้ตอบกับแอปพลิเคชันทั้งหมดได้ใช่ว่าจะเป็นทางเลือกที่เป็นไปได้ แต่
  • ข้อได้เปรียบหลักของ SP คือวิธีการที่แตกต่างจาก data-access-code ที่มีการสืบค้นแบบ inline, SPs เป็นคำสั่งที่รวบรวมไว้ล่วงหน้าดังนั้นพวกเขาจะทำงานได้เร็วขึ้น และค่าใช้จ่ายในการสื่อสาร (ผ่านเครือข่าย) จะเป็นอย่างน้อย
  • ตรงข้ามกับที่ SP จะเพิ่มโหลดไปยังเซิร์ฟเวอร์ฐานข้อมูล หากเป็นเรื่องที่น่ากังวลตามสถานการณ์เซิร์ฟเวอร์การเข้าถึงข้อมูลส่วนกลางที่มีการสืบค้นแบบอินไลน์จะเป็นตัวเลือกที่ดีกว่า

9

กระบวนงานที่เก็บไว้ส่วนใหญ่จะใช้เพื่อดำเนินงานบางอย่างกับฐานข้อมูล ตัวอย่างเช่น

  • รับชุดผลลัพธ์ฐานข้อมูลจากตรรกะทางธุรกิจบางอย่างเกี่ยวกับข้อมูล
  • ดำเนินการฐานข้อมูลหลายรายการในการโทรครั้งเดียว
  • ใช้เพื่อย้ายข้อมูลจากตารางหนึ่งไปยังอีกตารางหนึ่ง
  • สามารถถูกเรียกสำหรับภาษาโปรแกรมอื่น ๆ เช่น Java

7

โพรซีเดอร์ที่เก็บคืออะไร แต่กลุ่มของคำสั่ง SQL ที่คอมไพล์ลงในแผนปฏิบัติการเดี่ยว

  1. สร้างครั้งเดียวและเรียกมันว่า n จำนวนครั้ง
  2. จะลดปริมาณการใช้เครือข่าย

ตัวอย่าง: การสร้างกระบวนงานที่เก็บไว้

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE GetEmployee
      @EmployeeID int = 0
AS
BEGIN
      SET NOCOUNT ON;

      SELECT FirstName, LastName, BirthDate, City, Country
      FROM Employees 
      WHERE EmployeeID = @EmployeeID
END
GO

แก้ไขหรือแก้ไขโพรซีเดอร์ที่เก็บ:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE GetEmployee
      @EmployeeID int = 0
AS
BEGIN
    SET NOCOUNT ON;

    SELECT FirstName, LastName, BirthDate, City, Country
    FROM Employees 
    WHERE EmployeeID = @EmployeeID
END
GO

ปล่อยหรือลบโพรซีเดอร์ที่เก็บไว้:

DROP PROCEDURE GetEmployee

6

โพรซีเดอร์ที่เก็บไว้ใช้เพื่อดึงข้อมูลแก้ไขข้อมูลและลบข้อมูลในตารางฐานข้อมูล คุณไม่จำเป็นต้องเขียนคำสั่ง SQL ทั้งหมดทุกครั้งที่คุณต้องการแทรกอัปเดตหรือลบข้อมูลในฐานข้อมูล SQL


4
  • กระบวนงานที่เก็บไว้เป็นชุดที่คอมไพล์แล้วของคำสั่ง SQL อย่างน้อยหนึ่งคำสั่งซึ่งทำงานบางอย่างที่เฉพาะเจาะจง

  • ขั้นตอนการจัดเก็บควรดำเนินการแบบสแตนด์อโลนโดยใช้ EXEC

  • โพรซีเดอร์ที่เก็บสามารถส่งคืนพารามิเตอร์หลายตัว

  • ขั้นตอนการจัดเก็บสามารถใช้ในการทำธุรกรรม


4

"ขั้นตอนการจัดเก็บคืออะไร" ได้รับคำตอบแล้วในโพสต์อื่น ๆ ที่นี่ สิ่งที่ฉันจะโพสต์เป็นวิธีที่รู้จักกันน้อยในการใช้ขั้นตอนการจัดเก็บ มันเป็นหรือgrouping stored proceduresnumbering stored procedures

การอ้างอิงไวยากรณ์

ป้อนคำอธิบายรูปภาพที่นี่

; numberตามนี้

จำนวนเต็มเผื่อเลือกที่ใช้กับโพรซีเดอร์กลุ่มที่มีชื่อเดียวกัน โพรซีเดอร์ที่จัดกลุ่มเหล่านี้สามารถรวมเข้าด้วยกันโดยใช้คำสั่ง DROP PROCEDURE หนึ่งคำสั่ง

ตัวอย่าง

CREATE Procedure FirstTest 
(
    @InputA INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)
END
GO

CREATE Procedure FirstTest;2
(
    @InputA INT,
    @InputB INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO

ใช้

exec FirstTest 10
exec FirstTest;2 20,30

ผลลัพธ์

ป้อนคำอธิบายรูปภาพที่นี่

ความพยายามอื่น

CREATE Procedure SecondTest;2
(
     @InputA INT,
    @InputB INT
)
AS 
BEGIN
    SELECT 'A' + CONVERT(VARCHAR(10),@InputA)+ CONVERT(VARCHAR(10),@InputB)
END
GO

ผลลัพธ์

ข่าวสารเกี่ยวกับ 2730, ระดับ 11, สถานะ 1, กระบวนงาน SecondTest, บรรทัด 1 [Batch Start Line 3] ไม่สามารถสร้างขั้นตอน 'SecondTest' ด้วยหมายเลขกลุ่ม 2 เนื่องจากกระบวนงานที่มีชื่อเดียวกันและหมายเลขกลุ่ม 1 ไม่มีอยู่ใน ฐานข้อมูล ต้องดำเนินการ CREATE PROCEDURE 'SecondTest'; 1 ก่อน

การอ้างอิง :

  1. สร้าง PROCEDURE ด้วยไวยากรณ์สำหรับตัวเลข
  2. หมายเลขกระบวนงานที่เก็บไว้ใน SQL Server - techie-friendly.blogspot.com
  3. การจัดกลุ่มขั้นตอนการจัดเก็บ - sqlmag

ข้อควรระวัง

  1. หลังจากที่คุณจัดกลุ่มขั้นตอนต่าง ๆ คุณจะไม่สามารถวางทีละรายการได้
  2. คุณสมบัตินี้อาจถูกลบใน Microsoft SQL Server รุ่นต่อไป

0

กระบวนงานที่เก็บไว้คือชุดชื่อของคำสั่ง SQL และตรรกะเชิงกระบวนงานเช่นรวบรวมตรวจสอบและเก็บไว้ในฐานข้อมูลเซิร์ฟเวอร์ โดยทั่วไปขั้นตอนการจัดเก็บจะได้รับการปฏิบัติเหมือนวัตถุฐานข้อมูลอื่นและควบคุมผ่านกลไกความปลอดภัยของเซิร์ฟเวอร์


0

ใน DBMS กระบวนการที่เก็บไว้คือชุดของคำสั่ง SQL ที่มีชื่อที่กำหนดซึ่งเก็บไว้ในฐานข้อมูลในรูปแบบที่คอมไพล์เพื่อให้สามารถใช้ร่วมกันได้หลายโปรแกรม

การใช้โพรซีเดอร์ที่เก็บไว้จะมีประโยชน์ใน

  1. การให้การควบคุมการเข้าถึงข้อมูล (ผู้ใช้สามารถป้อนหรือเปลี่ยนแปลงข้อมูลได้ แต่ไม่สามารถเขียนขั้นตอนได้)

  2. การรับรองความถูกต้องของข้อมูล (ข้อมูลจะถูกป้อนในลักษณะที่สอดคล้องกัน) และ

  3. ปรับปรุงประสิทธิภาพการผลิต (งบของขั้นตอนการจัดเก็บจะต้องเขียนเพียงครั้งเดียว)


0

เพื่อความเรียบง่าย

Stored ProcedureคือStored Programs , โปรแกรม / ฟังก์ชั่นที่เก็บไว้ในฐานข้อมูล

แต่ละโปรแกรมที่เก็บไว้มีเนื้อหาที่ประกอบด้วยคำสั่ง SQL คำสั่งนี้อาจเป็นคำสั่งผสมที่ประกอบด้วยหลายคำสั่งคั่นด้วยเครื่องหมายอัฒภาค (;)

CREATE PROCEDURE dorepeat(p1 INT)
BEGIN
  SET @x = 0;
  REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
END;

0

โพรซีเดอร์ที่เก็บใน SQL Server สามารถยอมรับพารามิเตอร์อินพุตและส่งคืนพารามิเตอร์เอาต์พุตหลายค่า ใน SQL Server คำสั่งโปรแกรมโพรซีเดอร์ที่เก็บไว้เพื่อดำเนินการในฐานข้อมูลและส่งคืนค่าสถานะไปยังโพรซีเดอร์การโทรหรือแบตช์

ประโยชน์ของการใช้กระบวนงานที่เก็บไว้ใน SQL Server

อนุญาตการเขียนโปรแกรมแบบแยกส่วน อนุญาตให้ดำเนินการได้เร็วขึ้น พวกเขาสามารถลดปริมาณการใช้เครือข่าย สามารถใช้เป็นกลไกความปลอดภัยได้

นี่คือตัวอย่างของกระบวนงานที่เก็บไว้ที่ใช้พารามิเตอร์ดำเนินการแบบสอบถามและส่งกลับผลลัพธ์ กระบวนการที่เก็บไว้ยอมรับ BusinessEntityID เป็นพารามิเตอร์และใช้สิ่งนี้เพื่อจับคู่คีย์หลักของตาราง HumanResources.Employee เพื่อส่งคืนพนักงานที่ร้องขอ

> create procedure HumanResources.uspFindEmployee    `*<<<---Store procedure name`*
@businessEntityID                                     `<<<----parameter`
as
begin
SET NOCOUNT ON;
Select businessEntityId,              <<<----select statement to return one employee row
NationalIdNumber,
LoginID,
JobTitle,
HireData,
From HumanResources.Employee
where businessEntityId =@businessEntityId     <<<---parameter used as criteria
end

ฉันได้เรียนรู้สิ่งนี้จาก essential.com ... มันมีประโยชน์มาก


0

ขั้นตอนการจัดเก็บจะช่วยให้คุณสร้างรหัสในเซิร์ฟเวอร์คุณสามารถส่งพารามิเตอร์และค้นหาผลลัพธ์

create procedure_name (para1 int,para2 decimal)
as
select * from TableName

0

ในงบโพรซีเดอร์ Stored เขียนเพียงครั้งเดียวและลดทราฟฟิกเครือข่ายระหว่างไคลเอ็นต์และเซิร์ฟเวอร์ นอกจากนี้เรายังสามารถหลีกเลี่ยงการโจมตีของ SQL Injection

  • ในกรณีที่คุณใช้โปรแกรมของบุคคลที่สามในแอปพลิเคชันของคุณสำหรับการประมวลผลการชำระเงินฐานข้อมูลที่นี่ควรเปิดเผยข้อมูลที่จำเป็นและกิจกรรมที่บุคคลที่สามนี้ได้รับอนุญาตโดยเราสามารถบรรลุการรักษาความลับของข้อมูลได้
  • การอัปเดตของตารางควรทำเฉพาะกับตารางที่กำหนดเป้าหมาย แต่ไม่ควรอัปเดตตารางอื่น ๆ ซึ่งเราสามารถบรรลุความสมบูรณ์ของข้อมูลโดยใช้การประมวลผลธุรกรรมและการจัดการข้อผิดพลาด
  • หากคุณต้องการส่งคืนหนึ่งหรือหลายไอเท็มที่มีชนิดข้อมูลจะเป็นการดีกว่าถ้าใช้พารามิเตอร์เอาต์พุต
  • ในกระบวนงานที่เก็บไว้เราใช้พารามิเตอร์เอาต์พุตสำหรับสิ่งใดก็ตามที่จำเป็นต้องส่งคืน หากคุณต้องการส่งคืนรายการเดียวที่มีชนิดข้อมูลจำนวนเต็มเท่านั้นให้ใช้ค่าส่งคืนได้ดีกว่า ที่จริงแล้วค่าส่งคืนเป็นเพียงการแจ้งความสำเร็จหรือความล้มเหลวของขั้นตอนการจัดเก็บ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.