2012-03-24 42 views
6

Tôi mới trong PL/SQL đang thử một số ví dụ thực hành.
Tôi có vài thắc mắc về PL/SQL PROCEDURE & FUNCTION:khi nào tôi nên thực hiện thủ tục hoặc chức năng trong PL/SQL?

Khi nào tôi nên đi cho PROCEDURE hoặc FUNCTION?

phương tiện, bất kể công việc tôi đang làm bằng FUNCTION nhiệm vụ tương tự sẽ làm bằng cách sử dụng PROCEDURE. thì tại sao tôi nên sử dụng chức năng này? lợi thế của chúng là FUNCTION trên PROCEDURE trong PL/SQL?

FUNCTION phải trả về giá trị. Đây có phải là lợi thế duy nhất cho việc sử dụng một hàm hoặc có bất kỳ lợi thế nào khác của hàm không?

Trả lời

5

Có thể sử dụng chức năng do người dùng xác định, với một số giới hạn nhất định trong các tuyên bố SELECT và PL/SQL IF báo cáo trong khi không thể sử dụng PROCEDURE.

Bạn có thể SELECT từ một FUNCTION đó là CAST như một bảng sử dụng đường ống và PIPE ROW báo cáo, nhưng đó là một tính năng PL/SQL tiên tiến bạn có thể sử dụng nhiều sau này.

Tham khảo tài liệu cho nhà phát triển Oracle trực tuyến vì nó là miễn phí và rất tốt: Developing and Using Stored Procedures

+0

Những giới hạn đó là gì? Thủ tục có thể thực hiện tất cả chức năng có thể và nhiều hơn thế nữa. ví dụ bạn có thể trả lại một bảng như là tham số refcursor (s). Tôi hoài nghi khi sử dụng các hàm có thể mang lại kết quả không xác định, chẳng hạn như các tham số hàm liên quan đến ngày/giờ. Trong một thủ tục, bạn không có những hạn chế như vậy. Hàng ống là một trong những tuyên bố đơn giản nhất. Câu trả lời của bạn là nản lòng hơn là khuyến khích khán giả mới làm quen. – TonyP

+2

@TonyP Đối với một người không biết những điều cơ bản của PL/SQL, tôi sẽ không mở rộng các chi tiết của các thiết lập pragma chức năng và al - http://docs.oracle.com/cd/B12037_01/appdev.101/b10807 /13_elems039.htm- Câu trả lời của tôi để cung cấp hướng dẫn cho việc học thêm và không phải là một cửa hàng duy nhất mà Clif ghi lại phiên bản của tất cả. – tawman

+0

@jonearles Cảm ơn bạn đã chỉnh sửa chức năng * đường ống * – tawman

2
  1. Một hàm sẽ trả về một giá trị, A "value" có thể là một trong nhiều thứ trong đó có bảng PL/SQL, con trỏ ref vv Thêm cho rằng, có thể sử dụng một hàm trong các câu lệnh SQL, trong khi các thủ tục không thể được sử dụng.
  2. Thủ tục được sử dụng để thực thi logic nghiệp vụ, nơi chúng tôi có thể trả lại nhiều giá trị từ quy trình sử dụng các thông số OUT hoặc IN OUT.
  3. Cá nhân tôi sử dụng chức năng để tính toán - Ví dụ: kiểm tra một điều kiện cụ thể như truy xuất giá trị dựa trên điều kiện, kiểm tra điều kiện đúng hoặc sai.
  4. Bạn có thể có các câu lệnh DML (chèn, cập nhật, xóa) trong một hàm. Tuy nhiên, bạn không thể gọi một hàm như vậy trong một truy vấn SQL. * Ví dụ: Nếu bạn có một hàm đang cập nhật một bảng, bạn không thể gọi hàm đó trong bất kỳ truy vấn SQL nào.

    select myFunction(field) from sometable; --will throw error. 
    

Đó là vào sự lựa chọn của bạn cho dù sử dụng thủ tục hoặc chức năng phụ thuộc vào bạn yêu cầu và các tiện nghi của bạn.

+0

Bạn có thể sử dụng DML và DDL trong một hàm được sử dụng trong câu lệnh SQL, nhưng bạn cần khai báo nó là AUTONOMOUS_TRANSACTION. (Mặc dù nó có thể là một ý tưởng rất xấu để làm một điều như vậy.) –

+2

điểm 5 là sai. Bạn có thể làm ddl trong các hàm theo cách tương tự như trong các thủ tục. –

+0

@FlorinGhita: Cảm ơn tôi sẽ chỉnh sửa câu trả lời này trong câu trả lời của tôi –

0

ưu điểm chính:

  1. Chức năng nó phải trả về một giá trị nơi như thủ tục có thể hoặc không thể trả về một giá trị.
  2. Chức năng chủ yếu được sử dụng để tính giá trị. Trường hợp như thủ tục chủ yếu được sử dụng cho logic kinh doanh điều hành.
  3. Chức năng để lấy lại một giá trị khi làm thủ tục để tạo nên một giá trị.
  4. Chức năng phải trả về chỉ một giá trị nhưng nó chấp nhận nhiều loại trả lại.
-1

Có lợi thế hơn của việc sử dụng thủ tục qua các chức năng:

  1. Nếu chúng ta muốn thực hiện báo cáo kết quả động SQL sử dụng thực thi tuyên bố ngay sau đó chúng tôi sử dụng Thủ tục Nó không thể thực hiện bên trong các chức năng.

  2. Thủ tục có thể được thực hiện độc lập, trong khi Hàm phải là một phần của câu lệnh thi hành vì nó không thể được thực thi độc lập.

-1

chức năng phải trả lại giá trị được sử dụng trong mục đích tính toán mà chúng tôi đang sử dụng. Chức năng nó chỉ trả về một giá trị nhưng nó chấp nhận nhiều kiểu trả về. Hàm chúng ta có thể sử dụng câu lệnh chọn. Thủ tục có thể hoặc không thể trả về giá trị. Thủ tục là chúng tôi có thể sử dụng các hoạt động dml. Thủ tục chúng tôi chỉ có thể thực thi.

+1

Rất khó để hiểu những gì bạn đang cố gắng nói. –

-3

Tất nhiên bạn có thể thực thi sql động trong một hàm. Viết một hàm đơn giản để làm bài kiểm tra và bạn sẽ thấy nó hoạt động.

Bạn có thể sử dụng chức năng hoặc thủ tục hầu hết thời gian. Sự khác biệt là liệu bạn có muốn sử dụng chúng trong một câu lệnh SQL hay trong một câu lệnh IF sau đó sử dụng một hàm. Nếu không, hãy sử dụng những gì phù hợp nhất với bạn và ứng dụng gọi điện.

+0

Bạn đã hiểu sai – Bren

4

Tôi muốn làm rõ rằng câu trả lời cho dù bạn nên sử dụng thủ tục lưu trữ hay chức năng hoàn toàn phụ thuộc vào yêu cầu nghiệp vụ và quy trình thiết kế của bạn, miễn là bạn hiểu rõ mục tiêu của chương trình. Nếu bạn không rõ ràng về mục tiêu của bạn, chỉ là cách câu hỏi của bạn, không có số lượng các thủ tục mã hóa và chức năng sẽ hữu ích.

Bạn phải lưu ý rằng các thủ tục và chức năng được lưu trữ phục vụ các mục đích khác nhau trong lập trình PL/SQL. Cụ thể như sau:

  1. thủ tục lưu trữ:

    a. Các thủ tục được lưu trữ đại diện cho các khối được đặt tên (trái ngược với các khối ẩn danh) có khả năng chấp nhận các tham số và hoạt động trên chúng.

    b. Các thủ tục được lưu trữ xác định quy trình làm thủ tục độc lập, nơi bạn có thể thực hiện một loạt các DML và/hoặc các hoạt động khác.

    c. Các thủ tục được lưu trữ không phải trả về một giá trị. Do đó, chúng không thể được gọi từ bên trong một câu lệnh SQL. Các thủ tục lưu sẵn phải được thực hiện từ một khối PL/SQL có tên hoặc ẩn danh.

    d. Giá trị:

    • Thủ tục không phải trả về giá trị (Điều này cũng có thể là một điều khoản).
    • Có thể được sử dụng để thực hiện một loạt các hoạt động DML hoặc DDL (có, điều này có thể thông qua SQL động với một vài hạn chế).
    • Có thể đơn giản được gọi là một câu lệnh độc lập từ khối PL/SQL. ví dụ,

      myProcedure (x, y); 
      

    e.Demerits:

    • Không thể gọi từ truy vấn SQL - DML hoặc câu lệnh SELECT.
    • Không thể sử dụng trong chỉ mục.
  2. Chức năng:

    a. Các hàm được đặt tên là các khối có khả năng chấp nhận các tham số và trả về một giá trị.

    b. Các hàm cũng định nghĩa một quy trình làm thủ tục nhưng khi được sử dụng trong các câu lệnh SQL, bạn không thể thực hiện bất kỳ DML hoặc DDL nào.

    c. Hàm phải được gọi từ câu lệnh SQL hoặc PL/SQL khi giá trị được hàm trả về được sử dụng, được gán cho một biến, được chuyển thành tham số, v.v.

    d. Giá trị:

    • Có thể được sử dụng trong truy vấn SQL - DML hoặc câu lệnh SELECT.
    • Có thể được sử dụng trong các chỉ mục dựa trên chức năng nếu hàm là xác định (nghĩa là cho một bộ đầu vào xác định hàm trả về cùng một đầu ra mỗi khi nó được gọi).

    e. Demerits:

    • Nếu hàm được gọi từ truy vấn SQL chứa DML bất kỳ, truy vấn sẽ không thành công.
    • Bắt buộc đối với hàm trả về giá trị. Do đó một cuộc gọi hàm không thể là một câu lệnh độc lập như một cuộc gọi thủ tục.

Để tham khảo thêm, hãy truy cập Oracle Docs.

0

Bất cứ khi nào bạn muốn trả lại một số giá trị và phải sử dụng giá trị đó hơn nữa, hãy chuyển đến hàm. Nếu bạn muốn trả lại một số giá trị như kết quả cuối cùng, hãy làm thủ tục.

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