Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

hàm oracle và con trỏ sử dụng tên bảng động

  • Không cần khai báo c1 nhập cho một con trỏ tham chiếu được nhập yếu. Bạn chỉ có thể sử dụng SYS_REFCURSOR gõ.
  • Bạn không thể kết hợp các cuộc gọi con trỏ ngầm và rõ ràng như thế này. Nếu bạn định OPEN con trỏ, bạn phải FETCH từ nó trong một vòng lặp và bạn phải CLOSE nó. Bạn không thể OPENCLOSE nó nhưng sau đó tìm nạp từ nó trong một vòng lặp con trỏ ngầm.
  • Bạn sẽ phải khai báo một biến (hoặc các biến) để tìm nạp dữ liệu vào. Tôi đã khai báo một loại bản ghi và một phiên bản của bản ghi đó nhưng bạn có thể dễ dàng khai báo hai biến cục bộ và FETCH vào các biến đó.
  • ROWID là một từ dành riêng nên tôi đã sử dụng ROWPOS thay vào đó.

Kết hợp chúng lại với nhau, bạn có thể viết một cái gì đó như

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE Function Findposition (
  2      model_in IN varchar2,
  3      model_id IN number)
  4    RETURN number
  5  IS
  6    cnumber number;
  7    c2      sys_refcursor;
  8    type result_rec is record (
  9      id      number,
 10      rowpos  number
 11    );
 12    l_result_rec result_rec;
 13  BEGIN
 14    open c2 FOR 'SELECT id,ROW_NUMBER() OVER ( ORDER BY id) AS rowpos FROM '||model_in;
 15    loop
 16      fetch c2 into l_result_rec;
 17      exit when c2%notfound;
 18      IF l_result_rec.id=model_id
 19      then
 20        cnumber :=l_result_rec.rowpos;
 21      end if;
 22    END LOOP;
 23    close c2;
 24    RETURN cnumber;
 25* END;
SQL> /

Function created.

Tôi tin rằng điều này mang lại kết quả mà bạn mong đợi

SQL> create table foo( id number );

Table created.

SQL> insert into foo
  2    select level * 2
  3      from dual
  4   connect by level <= 10;

10 rows created.

SQL> select findposition( 'FOO', 8 )
  2    from dual;

FINDPOSITION('FOO',8)
---------------------
                    4

Lưu ý rằng từ quan điểm hiệu quả, bạn nên viết điều này dưới dạng một câu lệnh SQL duy nhất hơn là mở con trỏ và tìm nạp mọi hàng từ bảng mỗi lần. Nếu bạn quyết tâm sử dụng con trỏ, bạn muốn thoát khỏi con trỏ khi bạn tìm thấy hàng mình quan tâm hơn là tiếp tục tìm nạp mọi hàng từ bảng.

Từ quan điểm rõ ràng về mã, nhiều tên biến và kiểu dữ liệu của bạn có vẻ khá kỳ quặc. Tên thông số của bạn có vẻ được chọn kém-- Tôi không mong đợi model_in ví dụ như tên của bảng nhập liệu. Khai báo con trỏ có tên c2 cũng có vấn đề vì nó rất không mô tả.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Thứ tự thực thi các điều kiện trong mệnh đề SQL 'where'

  2. Cách thực thi chức năng trong Oracle với các tham số

  3. Cách làm việc với các Hàm ngày trong Oracle sql

  4. ORACLE / ASP.NET:ORA-2020 - Quá nhiều liên kết cơ sở dữ liệu ... điều gì gây ra điều này?

  5. ORACLE - tìm kết quả cụ thể bên trong LOOP (HOẶC TƯƠNG TỰ)