it-swarm-vi.tech

Sự khác biệt giữa con trỏ rõ ràng và ẩn trong Oracle là gì?

Tôi hơi bất lịch sự về biệt ngữ con trỏ trong PL/SQL. Có ai biết điều này không?

25
Brian G

Một con trỏ ẩn là một con trỏ được tạo ra "tự động" cho bạn khi bạn thực hiện một truy vấn. Nó đơn giản hơn để viết mã, nhưng bị 

  • không hiệu quả (tiêu chuẩn ANSI chỉ định rằng nó phải tìm nạp hai lần để kiểm tra nếu có nhiều hơn một bản ghi)
  • dễ bị lỗi dữ liệu (nếu bạn từng có hai hàng, nó sẽ tăng ngoại lệ.

Thí dụ

SELECT col INTO var FROM table WHERE something;

Một con trỏ rõ ràng là một con trỏ bạn tự tạo. Nó đòi hỏi nhiều mã hơn, nhưng cung cấp nhiều quyền kiểm soát hơn - ví dụ: bạn chỉ có thể mở tìm nạp nếu bạn chỉ muốn bản ghi đầu tiên và không quan tâm nếu có những bản khác. 

Thí dụ

DECLARE   
  CURSOR cur IS SELECT col FROM table WHERE something; 
BEGIN
  OPEN cur;
  FETCH cur INTO var;
  CLOSE cur;
END;
39
Sten Vesterli

Một con trỏ rõ ràng được định nghĩa như vậy trong khối khai báo:

DECLARE 
CURSOR cur IS 
  SELECT columns FROM table WHERE condition;
BEGIN
...

một con trỏ ẩn được ngụ ý trực tiếp trong một khối mã:

...
BEGIN
   SELECT columns INTO variables FROM table where condition;
END;
...
16
stjohnroe

1.CURSOR: Khi PLQuery phát hành các câu lệnh sql, nó tạo ra vùng làm việc riêng tư để phân tích và thực hiện câu lệnh sql được gọi là con trỏ.

2.IMPLICIT: Khi bất kỳ khối PL/SQLexecutable nào phát hành câu lệnh sql . PL/SQL tạo con trỏ ẩn và quản lý tự động có nghĩa là mở và đóng diễn ra. Nó được sử dụng khi trả về câu lệnh sql chỉ có một hàng. Nó có 4 thuộc tính SQL% ROWCOUNT, SQL% FOUND, SQL% KHÔNG CÓ, SQL% ISOPEN.

3.EXPLICIT: Nó được tạo và quản lý bởi lập trình viên. Nó cần mọi thời gian mở rõ ràng, tìm nạp và đóng. Nó được sử dụng khi tuyên bố sql trả về nhiều hơn một hàng Nó cũng có 4 thuộc tính CUR_NAME% ROWCOUNT, CUR_NAME% FOUND, CUR_NAME% KHÔNG CÓ, HIỆN TẠI% ISOPEN. Nó xử lý một số hàng bằng cách sử dụng vòng lặp. Các lập trình viên có thể truyền tham số quá cho con trỏ rõ ràng.

  • Ví dụ: Con trỏ rõ ràng

declare 
   cursor emp_cursor 
   is 
   select id,name,salary,dept_id 
   from employees; 
   v_id employees.id%type; 
   v_name employees.name%type; 
   v_salary employees.salary%type; 
   v_dept_id employees.dept_id%type; 
   begin 
   open emp_cursor; 
   loop 
   fetch emp_cursor into v_id,v_name,v_salary,v_dept_id; 
   exit when emp_cursor%notfound;
   dbms_output.put_line(v_id||', '||v_name||', '||v_salary||','||v_dept_id); 
   end loop;                    
   close emp_cursor; 
   end;
4
Ganesh Pathare

Các con trỏ ngầm định yêu cầu bộ nhớ đệm ẩn danh. 

Con trỏ rõ ràng có thể được thực thi lặp đi lặp lại bằng cách sử dụng tên của chúng. Chúng được lưu trữ trong không gian bộ nhớ do người dùng xác định thay vì được lưu trữ trong bộ nhớ đệm ẩn danh và do đó có thể dễ dàng truy cập sau đó.

3
prince
3
pablo

Một con trỏ rõ ràng là một con trỏ bạn khai báo, như:

CURSOR my_cursor IS
  SELECT table_name FROM USER_TABLES

Một con trỏ ẩn được tạo để hỗ trợ bất kỳ SQL nội tuyến nào bạn viết (tĩnh hoặc động).

3
Dave Costa

Trả lời cho câu hỏi đầu tiên. Trực tiếp từ tài liệu Oracle

Con trỏ là con trỏ tới SQL riêng khu vực lưu trữ thông tin về xử lý một CHỌN hoặc DML cụ thể tuyên bố.

3
Ian Carpenter

Với các con trỏ rõ ràng, bạn có toàn quyền kiểm soát cách truy cập thông tin trong cơ sở dữ liệu. Bạn quyết định khi nào MỞ con trỏ, khi nào FETCH ghi từ con trỏ (và do đó từ bảng hoặc bảng trong câu lệnh CHỌN của con trỏ) có bao nhiêu bản ghi để tìm nạp và khi nào ĐÓNG con trỏ. Thông tin về trạng thái hiện tại của con trỏ của bạn có sẵn thông qua kiểm tra các thuộc tính con trỏ.

Xem http://www.unix.com.ua/orelly/Oracle/prog2/ch06_03.htm để biết chi tiết.

2
Kristian

Trong PL/SQL, Con trỏ là con trỏ tới vùng ngữ cảnh này. Nó chứa tất cả các thông tin cần thiết để xử lý tuyên bố.

Các con trỏ ngầm định : Các con trỏ ngầm định được Oracle tự động tạo ra mỗi khi câu lệnh SQL được thực thi, khi không có con trỏ rõ ràng cho câu lệnh. Các lập trình viên không thể kiểm soát các con trỏ ngầm và thông tin trong đó.

Các con trỏ rõ ràng : Các con trỏ rõ ràng là các con trỏ do lập trình viên xác định để giành quyền kiểm soát nhiều hơn trong khu vực ngữ cảnh. Một con trỏ rõ ràng phải được xác định trong phần khai báo của Khối PL/SQL. Nó được tạo trên một câu lệnh CHỌN trả về nhiều hơn một hàng.

Cú pháp để tạo một con trỏ rõ ràng là:

CURSOR cursor_name IS select_statement; 
1
GOVIND DIXIT

Con trỏ là cửa sổ CHỌN trên bảng Oracle, điều này có nghĩa là một nhóm các bản ghi có trong bảng Oracle và đáp ứng các điều kiện nhất định. Một con trỏ cũng có thể CHỌN tất cả nội dung của bảng. Với một con trỏ, bạn có thể thao tác các cột của Oracle, đặt bí danh cho chúng trong kết quả. Một ví dụ về con trỏ ngầm là như sau:

BEGIN
   DECLARE
      CURSOR C1
      IS
         SELECT DROPPED_CALLS FROM ALARM_UMTS;

      C1_REC   C1%ROWTYPE;
   BEGIN
      FOR C1_REC IN C1
      LOOP
         DBMS_OUTPUT.PUT_LINE ('DROPPED CALLS: ' || C1_REC.DROPPED_CALLS);
      END LOOP;
   END;
END;
/

Với FOR ... LOOP ... END LOOP, bạn mở và đóng con trỏ một cách tự động, khi các bản ghi của con trỏ đã được phân tích.

Một ví dụ về con trỏ tường minh là như sau:

BEGIN
   DECLARE
      CURSOR C1
      IS
         SELECT DROPPED_CALLS FROM ALARM_UMTS;

      C1_REC   C1%ROWTYPE;
   BEGIN
      OPEN c1;

      LOOP
         FETCH c1 INTO c1_rec;

         EXIT WHEN c1%NOTFOUND;

         DBMS_OUTPUT.PUT_LINE ('DROPPED CALLS: ' || C1_REC.DROPPED_CALLS);
      END LOOP;

      CLOSE c1;
   END;
END;
/

Trong con trỏ rõ ràng, bạn mở và đóng con trỏ một cách rõ ràng, kiểm tra sự hiện diện của các bản ghi và nêu rõ một điều kiện thoát.

1
UltraCommit

Google là bạn của bạn: http://docstore.mik.ua/orelly/Oracle/prog2/ch06_03.htm

PL/SQL phát hành một con trỏ ẩn Bất cứ khi nào bạn thực thi một câu lệnh SQL trực tiếp trong mã của bạn, miễn là mã không sử dụng một .__ rõ ràng. con trỏ. Nó được gọi là "ngầm" con trỏ bởi vì bạn, nhà phát triển, làm không khai báo rõ ràng một con trỏ cho câu lệnh SQL.

Một con trỏ rõ ràng là một CHỌN tuyên bố được xác định rõ ràng trong phần khai báo của bạn mã và, trong quá trình, được gán một Tên. Không có thứ gọi là con trỏ rõ ràng để CẬP NHẬT, XÓA, và các câu lệnh INSERT.

1
Derek Swingley

Con trỏ ngầm chỉ trả về một bản ghi và được gọi tự động. Tuy nhiên, con trỏ rõ ràng được gọi thủ công và có thể trả về nhiều hơn một bản ghi.

1
shaiksyedbasha

Tôi biết đây là một câu hỏi cũ, tuy nhiên, tôi nghĩ sẽ tốt hơn nếu thêm một ví dụ thực tế để cho thấy sự khác biệt giữa hai quan điểm này.

Từ quan điểm hiệu suất, con trỏ tiềm ẩn nhanh hơn.

Chúng ta hãy xem sự khác biệt hiệu suất giữa hai:

SQL> SET SERVEROUTPUT ON
SQL> DECLARE
  2    l_loops  NUMBER := 100000;
  3    l_dummy  dual.dummy%TYPE;
  4    l_start  NUMBER;
  5
  6    CURSOR c_dual IS
  7      SELECT dummy
  8      FROM   dual;
  9  BEGIN
 10    l_start := DBMS_UTILITY.get_time;
 11
 12    FOR i IN 1 .. l_loops LOOP
 13      OPEN  c_dual;
 14      FETCH c_dual
 15      INTO  l_dummy;
 16      CLOSE c_dual;
 17    END LOOP;
 18
 19    DBMS_OUTPUT.put_line('Explicit: ' ||
 20                         (DBMS_UTILITY.get_time - l_start) || ' hsecs');
 21
 22    l_start := DBMS_UTILITY.get_time;
 23
 24    FOR i IN 1 .. l_loops LOOP
 25      SELECT dummy
 26      INTO   l_dummy
 27      FROM   dual;
 28    END LOOP;
 29
 30    DBMS_OUTPUT.put_line('Implicit: ' ||
 31                         (DBMS_UTILITY.get_time - l_start) || ' hsecs');
 32  END;
 33  /
Explicit: 332 hsecs
Implicit: 176 hsecs

PL/SQL procedure successfully completed.

Vì vậy, một sự khác biệt đáng kể là rõ ràng.

Thêm ví dụ ở đây .

1
Lalit Kumar B

Mỗi câu lệnh SQL được thực thi bởi cơ sở dữ liệu Oracle có một con trỏ được liên kết với nó, đây là vùng làm việc riêng để lưu trữ thông tin xử lý. Các con trỏ ngầm định được tạo bởi máy chủ Oracle cho tất cả các câu lệnh DML và SELECT.

Bạn có thể khai báo và sử dụng các con trỏ tường minh để đặt tên cho vùng làm việc riêng tư và truy cập thông tin được lưu trữ trong khối chương trình của bạn.

0
ropable

Như đã nêu trong các câu trả lời khác, con trỏ ẩn dễ sử dụng hơn và ít bị lỗi hơn. 

Các con trỏ ngầm định so với ẩn trong Oracle PL/SQL cho thấy các con trỏ ẩn nhanh hơn gấp hai lần so với các con trỏ rõ ràng.

Thật kỳ lạ khi chưa có ai nhắc đến Tiềm ẩn CHO LOOP Coder :

begin
  for cur in (
    select t.id from parent_trx pt inner join trx t on pt.nested_id = t.id
    where t.started_at > sysdate - 31 and t.finished_at is null and t.extended_code is null
  )
  loop
    update trx set finished_at=sysdate, extended_code = -1 where id = cur.id;
    update parent_trx set result_code = -1 where nested_id = cur.id;
  end loop cur;
end;

Một ví dụ khác về SO: PL/SQL CHO LOOP IMPLICIT HIỆN TẠI .

Nó ngắn hơn hình thức rõ ràng.

Điều này cũng cung cấp một cách giải quyết tốt cho cập nhật nhiều bảng từ CTE .

0
Vadzim