❶ oracle pl/sql中如何使用變數
定義並使用變數
PL/SQL有四種類型:標量類型,復合類型,引用類型 (reference),LOB(Large Obejct)類型
一、標量類型
最常用的就是標量類型,是指只能存放單個數值的變數,包括數字類型、字元類型、日期類型和布爾類型,每種類型又包含相應的子類型。
常量標量類型如下:
VARCHAR2 (n) , CHAR (n), NUMBER (p,s),DATE, TIMESTAMP , LONG , LONG RAW ,BOOLEAN,BINARY_INTEGER(僅 PL / SQL使用),BINARY_FLOAT和BINARY_DOUBLE(10g新引入的)
定義標量:
identifier [CONSTANT] datatype [NOT NULL] [:=| DEFAULT expr]
使用標量需要注意的是=號被:=取代,與delphi一樣的賦值符號@_@
例子:
v_name VARCHAR2 ( 10 );
v_rate CONSTANTS NUMBER ( 4 , 2 ) : = 3.04 ;
為了防止定義的變數類型與表中的欄位類型不一致,可以使用%TYPE來定義:
v_name employee.name % TYPE;
如上面所示,v_name的類型就與表 employee中的name欄位類型一樣!!
二、復合變數:
用於存放多個值的變數稱為復合變數,包括PL/SQL記錄,PL/SQL表,嵌套表和VARRAY四種類型
1.PL/SQL記錄
類似於C/C++中的結構概念:
declare
TYPE employee_record is RECORD(
id employee.id % TYPE,
name employee.name % TYPE,
email employee.email % TYPE);
em_record employee_record;
begin
select id,name,email into em_record from employee where name =& name;
dbms_output.put_line( ' 雇員名: ' || em_record.name || ' 雇員ID: ' || em_record.id);
end ;
2.PL/SQL表,類似於數組概念,不同的是PL/SQL表允許負值下標,而且沒有上下限,如:
declare
TYPE employee_table is table of employee.name % TYPE index by BINaRY_INTEGER;
em_table employee_table;
begin
select name into em_table( - 1 ) from employee where name =& name;
dbms_output.put_line( ' 雇員名: ' || em_table( - 1 ));
end ;
3.嵌套表,與PL/SQL 表相似,不同的是嵌套表可以做表列的數據類型,而PL/SQL表不能,使用嵌套表作為表列時,必須為其指定專門的存儲表,如:
create or replace TYPE emp_type as OBJECT(name VARCHAR2 ( 10 ),salary NUMBER ( 6 , 2 ),hiredate DATE);
CREATE OR REPLACE TYPE emp_array IS TABLE OF emp_type;
CREATE TABLE department(
deptno NUMBER ( 2 ),dname VARCHAR2 ( 10 ),
employee emp_array)NESTED TABLE employee STORE as employee_dept;
4.VARRAY(變長數組),與嵌套表相似,也可以做為表列的數據類型,但是嵌套表沒有個數限制,而VARRAY有個數限制,如:
CREATE TYPE TEST_ARRAY IS VARRAY(20) OF emp_type;
三、引用變數(reference)
類似於C++中的指針或者JAVA中引用的概念,用於存放數值指針的變數,使用此變數,可以使得應用程序共享相同對象,降低佔用空間。此類有兩種類型:游標(REF CURSOR)和對象類型(REF OBJECT)
1.REF CURSOR,定義時同時指定SELECT語句的游標稱為顯式或者靜態游標,在打開時才指定SELECT語句的游標稱為動態游標,如:
DECLARE
TYPE c1 IS REF CURSOR ;
emp_cursor c1;
v_name employee.name % TYPE;
v_sal employee.salary % TYPE;
begin
open emp_cursor for
SELECT name,salary FROM EMPLOYEE ;
LOOP
FETCH emp_cursor INTO v_name,v_sal;
EXIT WHEN emp_cursor % NOTFOUND;
dbms_output.put_line(v_name);
END LOOP;
close emp_cursor;
end ;
2.REF OBJECT,與JAVA的引用概念相同,存儲的是指向對象的指針
四、LOB類型
LOB類型是指用於存儲大批量數據的變數,包括內部的3種(CLOB,BLOB,NCLOB)和外部LOB(BFILE)。
CLOB,NCLOB用於存儲大量的字元數據。
BLOB用於存儲大批量二進制數據(如圖象)。
BFILE則存儲指向OS文件的指針。
❷ oracle的sql怎麼定義變數啊
createorreplaceprocerep_insert
(avarchar2(8))
as
begin
insertintotable1select*fromtable2where"date"=a;
commit;
end;
上邊是創建
執行時
begin
p_insert('20110101');
end;
說一下,你這個a和表2里的類型必須都一致,都要是字元型,如果不是的話,輸入參數a不可以變,你可以在表2里用to_char函數將日期轉成這個格式
還有你表2里的欄位叫date,這個是關鍵字,所以加了雙引號
❸ Oracle和MySQL在SQL語句方面的區別
首先是大體一致的,只是分頁查詢時oracle用的偽列(rownum),mysql用的是limit,具體的可以網路一下分頁;
另外oracle對sql語句要求更為嚴格,而且oracle里變數較mysql更多點,oracle中有number型,有大數據類型,mysql沒得;
另外舉個例子,oracle不能插入為空列,而mysql是可以的(個人覺得,不知道正確與否)。還有他們兩者函數有不同之處,如轉日期函數oracle是to_date('要轉的字元串','格式')
--
select
to_date('2004-05-07
13:23:44','yyyy-mm-dd
hh24:mi:ss')
from
al,而mysql是str_to_date('08/09/2008',
'%m/%d/%y');
--
2008-08-09//都是針對字元串轉日期來的。
❹ ORACLE將變數作為SQL中的參數進行執行
--目標表名、欄位自己去修改
DECLARE
V_SQLVARCHAR2(500);
BEGIN
FORCIN(SELECTTABLE_NAME,COLUMN_NAME
FROMUSER_TAB_COLUMNS
WHERETABLE_NAME='TP_WARNING_INFO'
ORDERBYCOLUMN_ID)LOOP
V_SQL:='INSERTINTO目標表名(欄位名,欄位分組內容,內容的出現次數)SELECT'''||
C.COLUMN_NAME||'''ASCOLUMN_NAME,'||C.COLUMN_NAME||
',COUNT(*)FROM'||C.TABLE_NAME||'GROUPBY'||
C.COLUMN_NAME;
--DBMS_OUTPUT.PUT_LINE(V_SQL);
EXECUTEIMMEDIATEVC_SQL;
COMMIT;
ENDLOOP;
END;
我這邊就把拼接的sql列印出來了,應該是需要你要的效果把,有問題追問
❺ oracle 存儲過程是用什麼系統變數返回sql語句的執行結果的
DECLARE
v_cursor
NUMBER;
v_stat
NUMBER;
aa
VARCHAR(100);
bb
VARCHAR(100);
cc
VARCHAR(100);
dd
VARCHAR(100);
v_sql
VARCHAR(200);
BEGIN
v_sql
:='select
*
from
aaa';
v_cursor
:=
dbms_sql.open_cursor;
--打開游標;
dbms_sql.parse(v_cursor,
v_sql,
dbms_sql.native);
--解析動態SQL語句;
dbms_sql.define_column(v_cursor,
1,
aa,100);
--定義列
dbms_sql.define_column(v_cursor,
2,bb,
100);
dbms_sql.define_column(v_cursor,
3,cc,100);
dbms_sql.define_column(v_cursor,
4,
dd,100);
v_stat
:=
dbms_sql.execute(v_cursor);
--執行動態SQL語句。
❻ oracle sql語句傳變數
使用游標,單純的SQL沒法實現。
❼ oracle sql中能定義變數嗎
能的。一般是用declare 來標識 ,比如
declare
cntnumber;
msgvarchar2(50);
begin
--各種代碼
end;
這是一個代碼片段,定義了兩個變數。cnt 數字型;msg 字元型。
❽ ORACLE 我要在sql語句中使用變數,在後面的表裡面使用該變數
select to_char(add_months(sysdate,-1),'yyyymm') from al
是這個意思嗎?
看你的month_id是什麼類型的欄位了,字元型的話,可能還要稍加改動
比如你傳進去的是201303
select to_char(add_months(to_date('201303','yyyymm'),-1),'yyyymm') from al
❾ oracle 中動態sql語句,表名為變數,怎麼解
表名可用變數,但一般需要用到動態sql,舉例如下:
declare
v_date varchar2(8);--定義日期變數
v_sql varchar2(2000);--定義動態sql
v_tablename varchar2(20);--定義動態表名
begin
select to_char(sysdate,'yyyymmdd') into v_date from al;--取日期變數
v_tablename := 'T_'||v_date;--為動態表命名
v_sql := 'create table '||v_tablename||'
(id int,
name varchar2(20))';--為動態sql賦值
dbms_output.put_line(v_sql);--列印sql語句
execute immediate v_sql;--執行動態sql
end;
執行以後,就會生成以日期命名的表。