当前位置:首页 » 编程语言 » oraclesql语句变量
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

oraclesql语句变量

发布时间: 2022-05-25 15:16:25

❶ 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;
执行以后,就会生成以日期命名的表。