当前位置:首页 » 编程语言 » oraclesqlfunction

oraclesqlfunction

发布时间: 2023-01-07 15:46:04

A. Oracle 数据库 关于PLsql function 函数问题

可以自定义type,然后通过管道函数pipe返回type类型。

B. oracle中,自建function,我拼出一句SQL,请问在这个过程中,怎么去执行这条sql,可以直接返回一个table

不可能的, 一个ref cursor 和 table 类型不一样,table类型是一个变量,把结果存在里面,可以进行查询。 而ref cursor相当于是一个指针,指向的一个select语句,open的时候才执行查询。你如何对一个select语句进行查询呢?

C. oracle function传参

抱歉,没搞懂你的问题, 可否解释清楚?

从你给出的这么多来看你的问题,如果不对请指正:

  1. tkbn是否是自定义的类型--typevarchar2 , 请查一下

    如果是, 可否指出他是%type 还是%rowtype?

    如果不是,可否写清楚, 是否少了空格

  2. 你用了open for , 那么这个Ref Cursor是什么? 可否把游标写出来看一下

  3. “套了一层运行运行太慢了” 你的问题是要解决速度问题,还是什么其他问题。


D. oracle sql 管道函数是什么

oracle管道函数是一类特殊的函数,关键字PIPELINED表明这是一个oracle管道函数,oracle管道函数返回值类型必须为集合。
例子:
create or replace function f_pipeline_test
return MsgType
PIPELINED
as
begin
for i in 1 .. 10
loop
pipe row( 'Iteration ' || i || ' at ' || systimestamp );
dbms_lock.sleep(1);
end loop;
pipe row( 'All done!' );
return;
end;
/

E. oracle中sql语句建表的时候check约束要使用自定义的函数,怎么用

参考
Oracle
的文档:
Application
Developer's
Guide
-
Fundamentals
6
Maintaining
Data
Integrity
in
Application
Development
Restrictions
on
CHECK
Constraints
A
CHECK
integrity
constraint
requires
that
a
condition
be
true
or
unknown
for
every
row
of
the
table.
If
a
statement
causes
the
condition
to
evaluate
to
false,
then
the
statement
is
rolled
back.
The
condition
of
a
CHECK
constraint
has
the
following
limitations:
The
condition
must
be
a
boolean
expression
that
can
be
evaluated
using
the
values
in
the
row
being
inserted
or
updated.
The
condition
cannot
contain
subqueries
or
sequences.
The
condition
cannot
include
the
SYSDATE,
UID,
USER,
or
USERENV
SQL
functions.
The
condition
cannot
contain
the
pseudocolumns
LEVEL,
PRIOR,
or
ROWNUM.
The
condition
cannot
contain
a
user-defined
SQL
function.
请注意那关键的一句:
The
condition
cannot
contain
a
user-defined
SQL
function.
CHECK
的内容,
不能包含一个用户自定义的函数。
你可以尝试使用触发器来处理这个问题。

F. oracle中function和procere是什么意思

oracle中function是函数,而procere是存储过程。
函数:
函数用于返回特定数据。执行时得找一个变量接收函数的返回值。
语法如下:
create or replace function function_name
(
argu1 [mode1] datatype1,
argu2 [mode2] datatype2, ........
)
return datatype
is
begin
end;存储过程:
存储过程(Stored
Procere)是在大型数据库系统中,一组为了完成特定功能的SQL
语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
语法如下:
CREATE OR REPLACE PROCEDURE 存储过程名
IS
BEGIN
NULL;
END;

G. oracle数据库SQL

1、写出创建此数据库表的sql语句(student,course,score三个表任意写一个创建语句)
CREATE TABLE STUDENT
(
stu_id VARCHAR2(20),
name VARCHAR2(20),
Age INTEGER,
sex CHAR(2),
stu_class VARCHAR2(12)

)
2、给表course的课程号(co_id)字段添加主键约束,给成绩表score的课程号(co_id)字段添加外键约束,其中主表是course,从表示score,写出sql语句
ALTER TABLE COURSE ADD CONSTRAINT COURSE_P_COID PRIMARY KEY (CO_ID);
ALTER TABLE SCORE ADD CONSTRAINT SCORE_F_COID FOREIGN KEY(CO_ID) REFERENCES COURSE(CO_ID) ;

3、向score表中插入一条记录,写出此sql语句
INSERT INTO SCORE VALUES ('1111000',1,90);

4、查询课程成绩大于80分的学生姓名和课程名,写出sql语句
SELECT B.NAME,C.CO_NAME FROM SCORE A,STUDENT B,COURSE C
WHERE A.STU_ID=B.STU_ID
AND A.CO_ID=C.CO_ID
AND A.SCORE>80
5、编写函数返回女同学的平均课程成绩是多少(女同学:sex=’ 女),写出sql语句
CREATE OR REPLACE FUNCTION FUN_GETSCORE
RETURN NUMBER
IS
V_SCORE NUMBER;

BEGIN
SELECT AVG(A.SCORE) INTO V_SCORE FROM SCORE A,STUDENT B
WHERE A.STU_ID=B.STU_ID
AND B.SEX='女';
RETURN V_SCORE;
END;
6、编写存储过程,更新学生成绩表score的课程成绩(score)字段,更新语句为:update score set score=newscore where stu_id=stuid and co_id=coid其中新的成绩,学号,课程号作为传人的形式参数,定义为:newscore in number,stuid in varchar2,coid in varchar2,写出此sql语句
CREATE OR REPLACE PROCEDURE P_UPDATE_SCORE(newscore in number,stuid in varchar2,coid in varchar2)
AS

BEGIN
update score set score=newscore where stu_id=stuid and co_id=coid;
COMMIT;
END;

H. 如何调整oracle中的sql语句输入的最大长度

Oracle SQL 语句in长度不得超过1000
IN 子句中的LIST个数最长为1000,超过该数目将报错,这里可转用一个临时表来解决;CREATE TRIGGER语句文本的字符长度不能超过32KB(触发器中不能使用LONG, LONG RAW 类型;触发器内可以参照LOB 类型列的列值,但不能通过 :NEW 修改LOB列中的数据;)顺便说一下,触发器中的PARENT关键字,只在嵌套表触发器中有效,11G以前,DBMS_SQL对输入的SQL长度不能超过32K,原因是输入参数只能是VARCHAR2类型,11G后,可以用CLOB作为输入参数,则取消了这个限制一个PL/SQL的包、过程、函数、触发器的大小,在UNIX上最大是64K,而WINDOWS则是32K大小(32K这个应该不准,看下面的测试)SQL语句可以有多长?(网友说)ORACLE文档说是64K,实际受一些工具的限制会较这个值低,但网友测试发现可以很长,甚至超过1M(我测试过 170K的都没问题)。具体多长,10G也未说明,只是与很多环境有关:数据库配置,磁盘空间,内存多少。。。
PL/SQL中,表达式/SQL本身的长度是可以达到比较长的长度(50K)左右,如:v_str:=:new.f1||:ndw.f2。。。 ; select :new.f1||:new.f2。。。 into v_str from al; 另外发现,如果这样写:v_str := ‘a’||’b’||。。。则允许的表达式长度将大大的减少。如果表达式/SQL过长,超过了一个ORACLE包/过程允许的最大程序长度,则在编译时报 pls-123:program too large错误,这是pl/sql编译器本身的限制造成的,即表达式/SQL的长度在PL/SQL中受限于包/过程的最大大小=================================================Oracle Sql语句长度限制问题及解决
最近在写Sql语句时,碰到两个问题:
1)ORA-01795: maximum number of expressions in a list is 1000起因:写出了这样的sql语句:SELECT PALLET_ID,BOX_ID,STATUS FROM SD_CURRENT_BOX WHERE PALLET_ID IN('"+pallets+"');其中的pallets是有很多个pallet_id组合成的字符串。
分析:很显然,根据错误提示可以知道:in 中items的限制 1000个。
解决:用子查询来代替pallets长字串。
2)ORA-01704: string literal too long
起因:写出了这样的Sql语句:UPDATE PDM_MEMBERLIST SET MEMBERS='<Project> ... 此处略去n多串 <ProjectID>'.
分析:数据库设计MEMBERS字段为xmltype格式,数据存储时候,是以字符串的形式存储。这样在xml数据量大的时候,造成sql语句过长,尝过2k的限制。
解决:参数化sql语句。
==================================================参数化sql语句----防止sql注入攻击(下)
上一篇写的sql注入的基本原理,本来要接着写这篇的,但是由于时间的原因一直没有写成,今天是五一假期,总算是能抽空写写了。
作为一个程序员,防范sql注入的第一线是由我们来守护的,只要我们在程序中留少许的漏洞,就会给程序增强安全特性。所以我们要做的是要写安全的程序,防止sql注入在程序体现在不要拼接sql字符串,一定要参数化sql或者写存储过程,这里就说说简单的参数化sql吧。
例子中用c#和Oracle实现,Java中或者其他数据库中的实现也是类似的。
using System.Data.OracleClient;//引入oracle操作包//定义DML语句
string strSQL = @"select user.name from user where user.name =:userName";//上句中的:userName就是sql语句中参数的占位符,也就是说在数据库服务器中执行这条sql语句的时候这个占位符要被其他东西替换掉,到底用什么东西替换呢,接着往下看OracleParameter[] param = {
new OracleParameter(":userName",txtName);}//这里定义一个参数的数组,里面可以写入多个sql参数,咱们的这里只有一个,所以就写入一个参数,这里讲占位符和他的替换也就是参数值对应起来了,txtName就是占位符的替换值,他是用户界面中用户输入的值,就是他可能含有注入攻击的字符,这下数据库服务器知道用什么东西替换占位符了。
定义好sql语句和参数后就是执行了,执行的时候需要同时将sql语句和参数传入,这样用户输入的带有非法字符的字符串在数据库会当作参数处理,而不会当作sql语句和数据库自己的字符混乱,防止了注入攻击。
OracleCommandcmd = new OracleCommand();
cmd.CommandText= strSQL;//定义oracle命令的文本内容for(oracleParameter p in param)//将参数传入{
cmd.Parameters.Add(p);
}
cmd.ExecuteNonQuery();//执行命令
上面基本上是一个完整的参数化sql,不同的数据库服务器sql语句中参数的占位符不同,上面用的是oracle,参数占位符是冒号(:)加名字,在sqlserver中是用@符号加名字作为占位符,而在MySQL中用问号(?)加名字来作为参数占位符,不同的数据库中参数的表示符号不一样,这个需要注意。
防止sql注入攻击(上)
Sql注入是一种入门极低破坏极大的攻击方式。如果sql是用字符串拼接出来的话,那么肯定会被注入攻击,前段时间还传出了某国外大型社交网站被SQL注入攻击。
Sql注入攻击的方式,来这里看的同志们应该很清楚了,就是在拼接字符串的时候,如果输入的是带单引号的,那么输入laf'or 1='1'--这样就会逃避条件检查,后面要是再跟一些shutdown,delete之类的条件,那么损失基本算是毁灭性的了。前几天单位开发的过程中我发现几乎大家都不重视安全,一个写代码的人不注意安全只注意实现那么写出来的代码在攻击者眼前基本就是一个没有穿衣服的美女。
下面是我一个开发人员的一些经验,主要用来防止sql注入。
1、首先对运行sql的用户赋予最小权限,这个理论也是安全领域的最小特权理论,运行一个程序一定要用最小特权运行,所以不要给用户服务DBA的权限,限制要权限之后可以防止一些毁灭性的攻击,即使攻入了也不会shutdown修改表之类的。
2、一定不要使用字符串拼接的方式构造sql,必须使用参数化sql,存储过程可以看作是参数sql,简单的就直接构造参数化sql,复杂的就写存储过程,不过存储过程中一定不要用字符串,我看有人在存储过程用字符串,这样还是不能避免被攻击,并且在调试的时候非常麻烦。
3、严把输入关,系统肯定是用来交互的,所有用户输入的这一关一定要把好,可以利用各种方式来检验用户的输入,让输入都是合法的;可以设敏感字符不让用户输入,这个虽然不是很友好,不过对与安全有保证。在验证的是可以用正则表达式或者程序验证,不管用什么方式只要把敏感字符和可疑字符拒之门外那么就无法攻击了,不过限制输入还是有缺陷,在安全理论方面,只能确定合法,不能确定不合法,比如你在界面限制了合法的,那么剩余的都是不合法的,这时候输入的肯定全部是合法的,如果你限制的是非法的,可是你能确保你限制的全是非法的?如果某一天发现一个非法的不再你限制之内那么你就会被攻击。
4、做好自己的检验和测试工作,自己可以进行sql注入攻击,利用工具检验。
5、一定要养成具有安全意识的程序员,时刻想着安全。
这几条之中最重要的是1和2,权限限制一定要注意,不然会死的很惨的,第二就是程序员的习惯了,一定要用参数化sql和数据库交互。

I. ORACLE FUNCTION 中如何动态执行一个未知具体列SQL后得到每行每列的数据(对每行数据的每列加分隔符拼接用)

这个需求好奇怪……

既然SQL是入参,想怎么拼还不是传进去的入参的问题?

按照你的例子最后的要求,想要得到'aaa分隔符bbb'的话,入参应该是“SELECT 'aaa' || '分隔符 || 'bbb' FROM al”;

另外列名也是可以从入参定义的啊。例如刚才你的列名如果想要叫ccc的话,入参改成“SELECT 'aaa' || '分隔符 || 'bbb' AS ccc FROM al”

难道还能不知道入参而调用Function么?

J. 关于oracle数据库中函数的概念,作用

函数可以认为是一个输入端一个输出端的转换程序。
主要为我们编写SQL提供了一种简单高效的处理方式

热点内容
html5整站源码 发布:2025-07-08 00:36:01 浏览:943
sql创建链接 发布:2025-07-08 00:08:38 浏览:398
ftp上传中断 发布:2025-07-08 00:08:37 浏览:641
linux云计算课程 发布:2025-07-08 00:07:23 浏览:23
安卓网易云怎么发布歌曲 发布:2025-07-07 23:42:29 浏览:626
安卓内存读取脚本 发布:2025-07-07 23:42:19 浏览:871
python27汉化 发布:2025-07-07 23:42:18 浏览:721
源码锁屏 发布:2025-07-07 23:26:52 浏览:944
手机版编程软件 发布:2025-07-07 22:57:22 浏览:122
linux下执行sh脚本 发布:2025-07-07 22:49:00 浏览:128