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

plsql表变量

发布时间: 2022-09-19 15:24:01

❶ plsql delete 表名无效

plsqldelete表名无效原因如下:
问题是不能将绑定变量用于表名,而Oracle文档则是数据库只使用绑定变量的值,不以任何方式解释其内容。
另外,请注意,如果不是双引号,对象名总是大写的,因此必须查找t_name||'_OLD',而不是t_name||'_old'。

❷ PLSQL集合表类型与对象表区别

PLSQL表变量类型

TYPE typ_id_record is RECORD(
gid NUMBER(10);
gno NUMBER(5);
co NUMBER(5));
TYPE typ_record_table is table of typ_id_record;
注意:PLSQL表变量类型必须在包头定义,否则会提示:Error:PLS-00642:不允许使用本地收集类型
集合在使用前需清空,typ_record_table.delete
对象表变量类型
CREATE OR REPLACE TYPE typ_id_object as OBJECT(
gid NUMBER(10);
gno NUMBER(5);
co NUMBER(5));
CREATE OR REPLACE TYPE typ_table_object as table of typ_id_object;
使用bulk collect批量获取查询结果集
bulk collect的使用区别

PLSQL表变量typ_record_table可以直接接受bulk collect,但对象表变量typ_object_table必须先进行转换
如下所示:
PLSQL表变量typ_record_table
CREATE OR REPLACE PROCEDURE p_f4 IS
tab_ids type_record_table;
BEGIN
SELECT gp.gid, gp.gno, gp.co BULK COLLECT
INTO tab_ids
FROM p_table_test gp;
END p_f4;
对象表变量typ_table_object不能直接接受bulk collect,必须进行转换
如下所示:
报错:没有足够的值
CREATE OR REPLACE PROCEDURE p_f4 is
tab_ids type_table_object;
begin
select gp.gid,gp.gno,gp.co bulk collect
into tab_ids
from p_table_test gp;
end;
解决办法: 将object变量进行转换,如下所示:
CREATE OR REPLACE PROCEDURE p_f4 is
tab_ids type_table_object;
begin
select type_table_object(gp.gid,gp.gno,gp.co) bulk collect
into tab_ids
from p_table_test gp;
end;

❸ plsql查询表中变量某段时间的值

select*
fromtabxxx
wheredtcol>=to_date('2017-06-01','yyyy-mm-dd')
anddtcol<=to_date('2017-06-3023:59:59','yyyy-mm-ddhh24:mi:ss')

❹ plsql中声明变量时可以指定哪种类型的约束

主键约束(Primary Key constraint):要求主键列数据唯一,并且不允许为空。

唯一约束(Unique constraint):要求该列唯一,允许为空,但只能出现一个空值。

检查约束(Check constraint):某列取值范围限制,格式限制等,如有关年龄、邮箱(必须有@)的约束。

默认约束(Default constraint):某列的默认值,如在数据库里有一项数据很多重复,可以设为默认值。

外键约束(Foreign Key constraint):用于在两个表之间建立关系,需要指定引用主表的哪一列。


❺ PLSQL中,定义一个RECORD类型变量r1 table1%rowtype,怎么样将table1表中的一条记录放到r1中,并且在r1中得

select table1.clo1,table1.clo2,table1.clo3 into r1.clo1,r1.clo2,r1.clo3 from table1
变量r1 是一个记录类型哦,r1 的结构和表table1 的结构完全一样,记录类型一次只能接受一条数据哦, 你再运行的时候添加一个限制条件,保证查出来的记录数只有一条,大概就这样了,不懂再问

❻ 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文件的指针。

❼ plsql如何测试sql,动态传入变量值。 比如:user表有id,name,age。 updat

加&<name>

引号内同样管用,字符类型

'&<name>' 或者 输入的时候 加''

❽ 如何将表名作为参数变量传给PLSQL中的函数

用动态SQL就可以了
CREATE OR REPLACE PROCEDURE COMMDEVIDEPAGE(P_TABLENAME IN VARCHAR2,
P_SIZE IN NUMBER,
P_PAGENOW IN NUMBER,
P_COUNT OUT NUMBER,
P_COUTPAGE OUT NUMBER,
P_CURSOR OUT SYS_REFCURSOR) IS
V_SQL VARCHAR2(1000);
V_SIZE NUMBER;
V_PAGENOW NUMBER;
V_BEGIN NUMBER;
V_END NUMBER;
BEGIN
V_SQL := 'SELECT COUNT(*) FROM ' || P_TABLENAME;
EXECUTE IMMEDIATE V_SQL
INTO P_COUNT; --计算总记录数
--求总页数
IF MOD(P_COUNT, P_SIZE) = 0 THEN
P_COUTPAGE := FLOOR(P_COUNT / P_SIZE);
ELSE
P_COUTPAGE := FLOOR(P_COUNT / P_SIZE) + 1;
END IF;
V_BEGIN := (P_PAGENOW - 1) * P_SIZE + 1;
V_END := P_PAGENOW * P_SIZE;

OPEN P_CURSOR FOR 'Select p.* From (Select Rid
From (Select Rid, Rownum Rn
From (Select Rowid Rid
From ' || P_TABLENAME || '
Where Promo_Id Is Not Null
Order By Promo_Id)
Where Rownum <=' || V_END || ')
Where Rn >=' || V_BEGIN || ') t,
' || P_TABLENAME || ' p
Where p.Rowid = t.Rid';
END COMMDEVIDEPAGE;

❾ plsql怎样把存储过程中查询的表的值赋给变量

select count(*) into x from a
在ORACLE里面直接这么写就可以了。

❿ 使用plsqldev调试时,如何查看结构体变量的值

dev c++调试时查看变量的值的方法:
1、 开始调试后,在图示区域按右键,选择"添加监测(Add Watch)";或者直接按 F4;
2、在弹出窗口中输入用户想查看的变量名,然后按确定(OK),就可以看到该变量的值;
3、用鼠标选择源文件中的变量名,然后按 F4 也可以查看变量的值,该变量会出现在左边的监测列表中;
4、如果用户在环境选项(Environment Options)中选择了"通过鼠标监测变量(Watch variable under mouse)",用鼠标指向您想要查看的变量一段时间,该变量也会被添加到监测列表中。
重要提示:
1). 当想查看指针指向的变量的值的时候,按 F4,然后输入星号及指针的名字(如 *pointer)。
如果没加 *,看到的将会是一个地址,也就是指针的值。
2). 有时,调试器(Debugger)可能不知道某个指针的类型,从而不能显示该指针指向的变量的值。
此时,我们需要手动输入该指针的类型。按 F4 后,以 *(type *)pointer 形式输入。例如,
*(int *)pointer。