當前位置:首頁 » 編程語言 » oracle動態sql游標

oracle動態sql游標

發布時間: 2022-07-27 13:26:56

⑴ 如何實現Oracle資料庫中的動態游標

  • createorreplaceprocereP_TEST_sqlis

  • TYPEref_cursor_typeISREFCURSOR;--定義一個動態游標

  • tablenamevarchar2(200)default'ess_client';

  • v_sqlvarchar2(1000);

  • mobilevarchar2(15);

  • usrsref_cursor_type;

  • begin

  • --使用連接符拼接成一條完整SQL

  • v_sql:='selectusrmsisdnfrom'||tablename||'whererownum<11';

  • --打開游標

  • openusrsforv_sql;

  • loop

  • fetchusrsintomobile;

  • exitwhenusrs%notfound;

  • insertintotmp(usrmsisdn)values(mobile);

  • endloop;

  • closeusrs;

  • commit;

  • endP_TEST_SQL;

⑵ 請問oracle動態游標和靜態游標最大的區別是什麼啊,謝謝

靜態游標指的是程序執行的時候不需要再去解析sql語言,對於sql語句的解析在編譯的時候就可以完成的。動態游標由於含有參數,對於sql語句的解析必須要等到參數確定的時候才能完成。從這個角度來說,靜態游標的效率也比動態游標更高一些。

⑶ Oracle ref游標動態sql里使用like語句老是報錯,高手幫忙看下!!!

|| ' WHERE ename LIKE :sname '

⑷ PLSQL 獲得動態游標 欄位名(列名)

oracle動態游標問題: 游標查詢的內容是 動態生成的,然後裡面具體有多少個欄位沒辦法事先知道,而動態游標賦值一定要用fetch到一個變數,有沒辦法把動態游標內容賦值到一個記錄集或者表中,而這個表的欄位和記錄集欄位是沒辦法預先定義好的,而是通過系統動態生成的!
具體例子如下:declare-- Local variables here
v_sql VARCHAR2(1024);
cur SYS_REFCURSOR;
v_column VARCHAR2(1024);
v_exe VARCHAR2(1024);begin---v_sql 是通過一連串的復雜邏輯程序生成的動態內容的 在這里就簡單寫了
v_sql:='select C_001,b_002,d_003 ..../*具體有多少個欄位沒辦法事先知道*/from table1,table2 .../*具體有多少個欄位沒辦法事先知道*/tablen where 1=1 and /*復雜條件*/';
v_column:= 'C_001+b_002/d_003';--這個變數也是通過復雜的邏輯生成的 沒辦法事先知道的 但是這里的欄位都在 v_sql 中有
v_column := replace(replace(REPLACE(v_column,'b_','c.b_'),'c_','c.c_'),,'c_','c.d_');
FOR i IN 1..e_table(i);
v_exe:='INSERT INTO table_a SELECT'|| v_column||' FROM al' ; /*這里的動態生成的*/!

⑸ oracle中游標的使用

這樣的問法好籠統,不過,還是把我整理的給你看看吧~個人整理,無復制的哦~
A:分類:
1:隱式游標:非用戶明確聲明而產生的游標. 你根本看不到cursor這個關鍵字.
2:顯示游標:用戶明確通過cursor關鍵字來聲明的游標.
3:引用游標:
B:什麼是隱式游標:
1:什麼時候產生:
會在執行任何合法的SQL語句中產生.他不一定存放數據.也有可能存放記錄集所影響的行數.
如果執行SELECT語句,這個時候游標會存放數據.如果執行INSERT、UPDATE、 DELETE會存放記錄影響的行數.
C:隱式游標叫什麼名字:
名字叫sql
關於sql的游標變數到底有哪些呢?
作用:返回最近一次執行SQL語句所涉及的游標相關信息.因為每執行一次SQL語句,都會產生一個隱式游標.那麼當前執行的SQL語句就是當前的隱式游標.
sql%found
sql%notfound
sql%rowcount
sql%isopen
D:關於隱式游標的例子:
create table 學生基本信息表
(
StuID number(2),
StuName varchar2(20)
)

alter table 學生基本信息表 add constraint PK_STUID primary key(StuID)

declare
num number:=0;
begin
num:=#
delete from 學生基本信息表 where StuID=num;
if sql%notfound then
dbms_output.put_line('該行數據沒有發現');
else
dbms_output.put_line('數據被發現並刪除,影響的行數為:'||sql%rowcount);
end if;
end;
E:關於顯示游標的例子:
1:如何定義顯示游標
declare cursor <cursor_name> is [select語句];
declare cursor mycur is select empno,ename,job from scott.emp;
2:如何打開游標:
open <cursor_name>;
open mycur;
3:如何通過游標來讀取數據
fetch <cursor_name> into <variable_list>
4:如何關閉游標:
close <cursor_name>;
close mycur;
注意:在Oracle中,不需要顯示銷毀游標.因為在Oracle中,很多東西是由JAVA寫的.Oracle會自動銷毀游標.
5:舉例:
declare
cursor mycur is select empno,ename,job from emp; --創建游標
vempno emp.empno%type;
vename emp.ename%type;
vjob emp.job%type;
begin
open mycur;--打開游標
fetch mycur into vempno,vename,vjob;--使用數據
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
dbms_output.put_line('讀取的數據為'||vempno||' '||vename||' '||vjob);
close mycur;
end;
因為只讀出來一條,所以要遍歷一下:
declare
cursor mycur is select empno,ename,job from emp;
vempno emp.empno%type;
vename emp.ename%type;
vjob emp.job%type;
begin
open mycur;
loop—循環,遍歷
fetch mycur into vempno,vename,vjob;
exit when mycur%notfound;
if mycur%found then
dbms_output.put_line('讀取的數據為'||vempno||' '||vename||' '||vjob);
end if;
end loop;
dbms_output.put_line('I Found You!'||mycur%rowcount||'行');
close mycur;
end;
6:通常情況下我們在讀取表數據的時候,我們需要動態的去查詢.所以能不能在Oracle中給游標帶參數呢?可以!
1):如何定義帶參數的游標:
declare cursor <cursor_name>(參數名稱 參數類型描述) is select xxxxx from bbbbb where aaa==??? and ccc=???;
2):例子:
游標是一個集合,讀取數據有兩種方式
第一種方式: open fetch close
第二種方式: for 一但使用了for循環 ,在循環剛剛開始的時候,相當於執行open,在處理循環的時候,相當於執行fetch,在退出循環的時候,相當於執行了close
Declare cursor query(vname varchar) is select empno,ename,job from emp where ename like'%'||vname||'%';

三種游標的例子:
--
DECLARE
CURSOR TEST_CUR IS
SELECT * FROM EMP;
MY_CUR EMP%ROWTYPE;
BEGIN
OPEN TEST_CUR;
FETCH TEST_CUR INTO MY_CUR;
WHILE TEST_CUR%FOUND
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
FETCH TEST_CUR INTO MY_CUR;
END LOOP;
CLOSE TEST_CUR;
END;

--
DECLARE
CURSOR TEST_CUR IS
SELECT * FROM EMP;
BEGIN
FOR MY_CUR IN TEST_CUR
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
END LOOP;
END;

--
DECLARE
CURSOR TEST_CUR(V_SAL NUMBER) IS
SELECT *
FROM EMP
WHERE SAL > V_SAL;
V_SAL1 NUMBER ;
BEGIN
V_SAL1 := 2000;
FOR MY_CUR IN TEST_CUR(V_SAL1)
LOOP
DBMS_OUTPUT.PUT_LINE(MY_CUR.EMPNO||','||MY_CUR.ENAME);
END LOOP;
END;

⑹ 我要寫一個oracle的存儲過程,需要用到一個動態的游標,因為表名和欄位個數都是變的,所以我想傳入sql語句

SQL> DECLARE
2 TYPE refcursor IS REF CURSOR;
3 v_cursor REFCURSOR;
4 v_Sql VARCHAR(200);
5 v_name VARCHAR(10);
6 BEGIN
7 -- 動態SQL
8 v_Sql := 'SELECT name FROM test_dysql';
9 -- 打開游標.
10 OPEN v_cursor FOR v_SQL;
11 -- 循環處理.
12 LOOP
13 -- 填充數據.
14 FETCH v_cursor INTO v_name;
15 -- 無數據時 退出循環.
16 EXIT WHEN v_cursor%NOTFOUND;
17 -- 輸出.
18 dbms_output.put_line(v_name);
19 END LOOP;
20 -- 關閉游標.
21 CLOSE v_cursor;
22 EXCEPTION
23 WHEN OTHERS THEN
24 -- 發生異常時,如果游標還打開,那麼關閉掉.
25 IF (v_cursor%isopen) THEN
26 CLOSE v_cursor;
27 END IF;
28 RAISE;
29 END;
30 /
A
B
C
D
E
PL/SQL procere successfully completed.

⑺ oracle怎麼創建動態sql(急)

好吧,我辛苦下,我來給你寫拼接SQL函數

create table t_a (
c1 varchar2(200),
c2 varchar2(200),
ca varchar2(200),
cb varchar2(200),
cc varchar2(200)
);

create or replace function get_sql_of_tab( c_owner varchar, c_tab_name varchar) return varchar2 as
c_sql varchar2(4000) ;
cursor c1 is
select t.column_name from dba_tab_cols t
where table_name = upper(c_tab_name)
and owner = upper(c_owner)
order by t.column_id;
begin
for r1 in c1 loop
c_sql := c_sql ||' ' || r1.column_name ||',' ;
end loop ;
c_sql := 'SELECT '|| substr(c_sql,1,length(c_sql)-1) || ' FROM '||upper(c_tab_name) ;
return c_sql ;
end get_sql_of_tab ;
/

---------------------以下是PL/SQL命令窗口函數的效果-------------

SQL> select get_sql_of_tab('gxbx','t_a') from al ;

GET_SQL_OF_TAB('GXBX','T_A')
--------------------------------------------------------------------------------
SELECT C1, C2, CA, CB, CC FROM T_A

嘿嘿,動態生產SQL,好吧剩下的你應該明白咋做了。

函數的兩個入參 用戶名 表名,NND忘記說了

⑻ oracle 存儲過程執行動態SQL 返回結果給游標,外部程序獲得dataset結果集。

你這樣寫就可以了,ORACLE存儲過程不需要返回值,只要參數是out就代表為輸出參數了,你給它傳一個游標進去,執行完,這個游標的值就是你查詢的值了。

⑼ ORACLE存儲過程中的動態游標

你這種, 表名字是是參數的情況下, 需要使用 動態 sql 來處理了。

你需要先定義一個變數, 來存儲你的 sql 語句。

然後 OPEN v_cursor FOR 那個 sql 語句的字元串

下面是一個例子:

SQL> DECLARE
2 TYPE refcursor IS REF CURSOR;
3 v_cursor REFCURSOR;
4 v_Sql VARCHAR(200);
5 v_name VARCHAR(10);
6 BEGIN
7 -- 動態SQL
8 v_Sql := 'SELECT name FROM test_dysql';
9 -- 打開游標.
10 OPEN v_cursor FOR v_SQL;
11 -- 循環處理.
12 LOOP
13 -- 填充數據.
14 FETCH v_cursor INTO v_name;
15 -- 無數據時 退出循環.
16 EXIT WHEN v_cursor%NOTFOUND;
17 -- 輸出.
18 dbms_output.put_line(v_name);
19 END LOOP;
20 -- 關閉游標.
21 CLOSE v_cursor;
22 EXCEPTION
23 WHEN OTHERS THEN
24 -- 發生異常時,如果游標還打開,那麼關閉掉.
25 IF (v_cursor%isopen) THEN
26 CLOSE v_cursor;
27 END IF;
28 RAISE;
29 END;
30 /
A
B
C
D
E

PL/SQL procere successfully completed.

熱點內容
ftpup上傳三個文件 發布:2025-01-25 01:38:15 瀏覽:762
錄音加密忘記 發布:2025-01-25 01:37:29 瀏覽:501
閑魚賣腳本 發布:2025-01-25 01:37:24 瀏覽:157
密碼匯款在什麼區域了兌付 發布:2025-01-25 01:36:49 瀏覽:146
wamp資料庫 發布:2025-01-25 01:36:02 瀏覽:794
安卓通知欄怎麼顯示秒錶 發布:2025-01-25 01:32:47 瀏覽:757
apk反編譯入門 發布:2025-01-25 01:26:43 瀏覽:472
英雄聯盟在哪投訴腳本 發布:2025-01-25 01:26:43 瀏覽:314
php在線統計 發布:2025-01-25 01:26:42 瀏覽:65
手機加密室 發布:2025-01-25 01:25:57 瀏覽:219