1 function 返回值
function get_link_coalingid(p_id in varchar2 ) return varchar2 is
r_lid varchar2(200);
begin
select t.link_coalingid into r_lid
from dis_w_package_train_link_his t
where t.pid = p_id and rownum <= 1 order by t.link_date desc ;
return r_lid;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
end;
2 执行动态sql
比如动态获取某个字段值
function getStanderByField(p_id in varchar2,fieldName in varchar2 ) return number is
iv_sqlstr VARCHAR2(200);
r_result number;
begin
iv_sqlstr := 'select '||fieldName||' from v_dis_w_package_train_type
where id = :1' ;
EXECUTE IMMEDIATE iv_sqlstr INTO r_result using p_id;
RETURN r_result;
end;
3 存储过程一样使用
参考
http://sishuok.com/forum/posts/list/792.html
http://blog.csdn.net/jumtre/article/details/38092067
http://blog.csdn.net/tanshi/article/details/7083922
---------------------------------------
1 EXECUTE IMMEDIATE
oracle中DBMS_SQL package包和EXECUTE IMMEDIATE都可以用来解析并执行动态SQL语句或非运行时创建的PL/SQL块,相比较而言,EXECUTE IMMEDIATE使用较简单,能够满足较常用的需要。
1.1 语法
EXECUTE IMMEDIATE v_sql [BULK COLLECT INTO 或INTO 返回值变量] [INTO 入参 1,.., out 出参1,..]。
说明:
1、v_sql为varchar2类型或clob(11g才支持),可以为DDL、DML等动态拼接的sql字符串。用在pl/sql代码中时,如果是varchar2类型,则长度不能大于32767(32K)。
2、v_sql为DML动态语句时,执行后不会提交,需要使用commit显式提交。如果为DDL命令,执行后则会提交所有之前改变的。
3、如果需要从动态sql返回值,则可以定义返回值变量,BULK COLLECT INTO返回多行值,此时定义的变量需是数组变量的列表或记录表类型;INTO返回单行,此时定义的变量可以使多个pl/sql变量的列表或记录类型。
4、如果动态sql中需要绑定变量,则使用USING,通常绑定的变量为输入入参,此时变量的in可以省略;如果需要绑定输出变量(如调用过程时可能需要输出),则在变量前用out显示指明。
1.2.1 动态DDL
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
BEGIN
v_sql := ' create table ' || v_table ||
' (id varchar2(10),name varchar2(100))';
EXECUTE IMMEDIATE v_sql;
END;
1.2.2 动态DML insert
1.2.2.1 不绑定输入变量
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
BEGIN
--1、不绑定输入变量
v_sql := ' insert into ' || v_table ||
' values (''1'',''no_binding_in_variable'')';
EXECUTE IMMEDIATE v_sql;
COMMIT; --dml需要显示提交
END;
1.2.2.2 绑定输入变量
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
BEGIN
--1、绑定输入变量
v_sql := ' insert into ' || v_table || ' values (:1,:2)';
EXECUTE IMMEDIATE v_sql
USING '2', 'binding_in_variable'; --使用using绑定输入变量
END;
1.2.3 动态DML select
1.2.3.1 返回单行值
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
--1、使用简单pl/sql变量v_id,v_name获得单行输出
v_id VARCHAR2(10);
v_name VARCHAR2(100);
--2、使用基于test_ynamic_sql表的记录变量获得单行输出
TYPE test_ynamic_sql_record IS RECORD(
v_id test_ynamic_sql.ID%TYPE,
v_name test_ynamic_sql.NAME%TYPE);
test_ynamic_sql_row test_ynamic_sql_record;
BEGIN
--1、使用简单pl/sql变量v_id,v_name获得单行输出
v_sql := ' select id,name from ' || v_table || ' where id=:1 ';
EXECUTE IMMEDIATE v_sql
INTO v_id, v_name
USING '1';
DBMS_OUTPUT.put_line('id=' || v_id || ',name=' || v_name);
--2、使用基于test_ynamic_sql表的记录变量获得单行输出
EXECUTE IMMEDIATE v_sql
INTO test_ynamic_sql_row
USING '1';
DBMS_OUTPUT.put_line('id=' || test_ynamic_sql_row.v_id || ',name=' ||
test_ynamic_sql_row.v_name);
END;
1.2.3.2 返回多行值
1.2.3.2.1 使用记录表获取
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
--1、使用基于test_ynamic_sql表的记录变量获得多行输出
TYPE test_ynamic_sql_record IS RECORD(
id test_ynamic_sql.ID%TYPE,
NAME test_ynamic_sql.NAME%TYPE);
TYPE test_ynamic_sql_table_type IS TABLE OF test_ynamic_sql_record INDEX BY BINARY_INTEGER;
/*可以用以下方式定义记录表*/
--TYPE test_ynamic_sql_table_type IS TABLE OF test_ynamic_sql%ROWTYPE INDEX BY BINARY_INTEGER;
test_ynamic_sql_multi_row test_ynamic_sql_table_type;
BEGIN
--1、使用基于test_ynamic_sql表的记录变量获得多行输出
v_sql := ' select id,name from ' || v_table;
EXECUTE IMMEDIATE v_sql BULK COLLECT
INTO test_ynamic_sql_multi_row;
FOR m IN 1 .. test_ynamic_sql_multi_row.COUNT LOOP
DBMS_OUTPUT.put_line('id=' || test_ynamic_sql_multi_row(m)
.id || ',name=' || test_ynamic_sql_multi_row(m).NAME);
END LOOP;
END;
1.2.3.2.2 使用多个嵌套表获取
DECLARE
v_sql VARCHAR2(1000);
v_table VARCHAR2(30) := 'test_ynamic_sql';
--1、使用基于多个嵌套表获取多行输出
TYPE test_ynamic_sql_id_type IS TABLE OF test_ynamic_sql.ID%TYPE INDEX BY BINARY_INTEGER;
TYPE test_ynamic_sql_name_type IS TABLE OF test_ynamic_sql.NAME%TYPE INDEX BY BINARY_INTEGER;
test_ynamic_sql_multi_row_id test_ynamic_sql_id_type;
test_ynamic_sql_multi_row_name test_ynamic_sql_name_type;
BEGIN
--1、使用基于多个嵌套表获取多行输出
v_sql := ' select id,name from ' || v_table;
EXECUTE IMMEDIATE v_sql BULK COLLECT
INTO test_ynamic_sql_multi_row_id, test_ynamic_sql_multi_row_name;
FOR m IN 1 .. test_ynamic_sql_multi_row_id.COUNT LOOP
DBMS_OUTPUT.put_line('id=' || test_ynamic_sql_multi_row_id(m) ||
',name=' || test_ynamic_sql_multi_row_name(m));
END LOOP;
END;
1.2.4 动态调用函数
1.2.4.1 使用select 获取返回值
DECLARE
v_sql VARCHAR2(1000);
v_name VARCHAR2(100);
BEGIN
--1、先创建测试函数
v_sql := ' CREATE OR REPLACE FUNCTION f_test_ynamic_sql(v_id VARCHAR2) RETURN VARCHAR2 IS
v_name VARCHAR2(100);
BEGIN
SELECT NAME INTO v_name FROM test_ynamic_sql WHERE id = v_id;
RETURN v_name;
END ; ';
EXECUTE IMMEDIATE v_sql;
--2、 使用select 获取返回值
v_sql := ' select f_test_ynamic_sql(:1) from dual';
EXECUTE IMMEDIATE v_sql
INTO v_name
USING '1';
DBMS_OUTPUT.put_line(' NAME = ' || v_name);
END;
1.2.4.2 使用begin .. end绑定函数输出变量
DECLARE
v_sql VARCHAR2(1000);
v_name_o VARCHAR2(100);
BEGIN
--1、先创建测试函数
v_sql := ' CREATE OR REPLACE FUNCTION f_test_ynamic_sql(v_id VARCHAR2,v_name_o out varchar2) RETURN VARCHAR2 IS
v_name VARCHAR2(100);
BEGIN
SELECT NAME INTO v_name FROM test_ynamic_sql WHERE id = v_id;
v_name_o:=v_name;
RETURN v_name;
END ; ';
EXECUTE IMMEDIATE v_sql;
--2、使用begin .. end绑定函数输出变量
v_sql := ' declare v_name varchar2(100);
begin v_name:=f_test_ynamic_sql(:1,:2); end;';
EXECUTE IMMEDIATE v_sql
USING '1', OUT v_name_o;
DBMS_OUTPUT.put_line('name_o=' || v_name_o); --using中的输出变量需要显示说明
END;
1.2.5 动态调用过程
DECLARE
v_sql VARCHAR2(1000);
v_name_o VARCHAR2(100);
BEGIN
--1、先创建测试过程
v_sql := ' CREATE OR REPLACE procedure p_test_ynamic_sql(v_id VARCHAR2,v_name_o out varchar2) IS
BEGIN
SELECT NAME INTO v_name_o FROM test_ynamic_sql WHERE id = v_id;
END ; ';
EXECUTE IMMEDIATE v_sql;
--2、使用begin .. end绑定过程输出变量
v_sql := ' begin p_test_ynamic_sql(:1,:2); end;';
EXECUTE IMMEDIATE v_sql
USING '1', OUT v_name_o; --using中的输出变量需要显示说明
DBMS_OUTPUT.put_line('name_o=' || v_name_o);
END;
分享到:
相关推荐
在Oracle数据库中,存储过程是一种预编译好的SQL代码集合,它可以接受输入参数、返回单个值或多个值,并能够执行复杂的数据库操作。存储过程提高了代码的重用性和执行效率,同时也便于实现复杂的业务逻辑。 #### 二...
函数是在Oracle数据库中定义的一组PL/SQL语句,用于计算并返回单个值。下面是一个计算年收入的函数示例: ```sql CREATE FUNCTION calculate_annual_salary (p_empno NUMBER) RETURN NUMBER IS year_sal NUMBER(7,...
### Oracle Function 返回结果集 #### 知识点概述 在Oracle数据库中,有时我们需要创建一个函数来返回一个结果集(即一系列记录),而非单一值。本文档中的代码示例展示了如何定义一个返回自定义表类型的函数`Ns_...
与存储过程类似,函数也是数据库中的预编译模块,但是函数主要用于返回单个值。函数的意义在于: 1. **灵活性**:函数可以根据不同的输入参数返回不同的结果,这使得它们非常灵活。 2. **代码重用**:函数可以在多...
存储过程可以通过OUT参数返回值,也可以使用函数(FUNCTION)来返回单个值。函数与存储过程的主要区别在于,函数必须有返回值。 6. **存储过程的修改和删除**: 使用 `ALTER PROCEDURE` 来修改已存在的存储过程,`...
对于返回单个值的存储过程,可以使用`OUT`参数。以下是一个例子: ```sql CREATE OR REPLACE PROCEDURE PRO_2(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2) AS BEGIN SELECT NAME INTO PARA2 FROM EMP WHERE ID= PARA1;...
Oracle存储过程是数据库管理系统Oracle中的一个重要特性,它允许程序员或数据库管理员编写一组SQL语句和PL/SQL代码,形成一个可重复使用的程序单元。在Oracle中,存储过程可以接受输入参数,处理数据,执行复杂的...
在Oracle数据库中,存储函数和存储过程是两种重要的PL/SQL编程组件,它们在数据库管理和应用程序开发中扮演着重要角色。虽然两者有许多相似之处,但它们之间也存在显著的差异。 首先,存储过程是一个预编译的PL/SQL...
- **多个返回值**:当需要返回多个值时,使用存储过程并通过OUT参数返回多个值。 ### 在Java中调用存储过程/存储函数 在Java中,可以使用JDBC驱动来调用存储过程或存储函数。通常需要使用`CallableStatement`对象来...
- **使用场景**: 存储函数通常用于计算和返回单个值,适用于那些需要多次重复使用的计算逻辑。 **2.2 与存储过程的区别** - **返回值**: 存储函数必须有一个返回值,而存储过程没有强制要求返回值。 - **调用方式*...
函数与存储过程相似,但它们的主要区别在于函数必须返回一个值,而存储过程可以没有返回值。在MySQL中,创建函数使用`CREATE FUNCTION`语句: ```sql CREATE FUNCTION func_name(param1 datatype) RETURNS datatype...
【存储过程简介】 存储过程是数据库中的一种重要组件,它是一组为了...通过以上步骤,开发者可以在Oracle环境中使用Java语言开发出高效、安全且具有广泛适用性的存储过程,从而优化数据库管理和提升应用程序的功能。
存储过程可以接收输入参数,输出参数,并且可以执行复杂的SQL查询和过程化逻辑。 ##### 语法: ```sql CREATE [OR REPLACE] PROCEDURE name [(parameter [,parameter])] IS [local declarations] BEGIN ...
Oracle数据库中的存储过程和存储函数是数据库管理的重要组成部分,它们提供了在数据库级别封装和执行复杂逻辑的能力。存储过程不返回值,而存储函数则会返回一个计算结果。 **存储过程** 是一组预先编译的SQL和PL/...
**注意:** Oracle支持使用包来组织存储过程和函数,而DB2则没有直接的包概念。 #### 七、全局变量 **Oracle:** ```sql CREATE OR REPLACE PACKAGE pkg1 AS g_var NUMBER; END pkg1; / ``` **DB2:** DB2中不...
Oracle数据库是世界上最广泛使用的数据库管理系统之一,其在数据管理和性能优化方面有着强大的功能。本笔记主要探讨了两个关键概念:约束和索引,这些都是Oracle数据库中的基础但至关重要的元素。 **1. 约束...
- **Oracle** 支持 PL/SQL,这是一种结合了 SQL 和过程编程的语言,提供了存储过程、函数、触发器等功能。 - **SQL Server** 使用 Transact-SQL (T-SQL),这是 SQL 的一个扩展,同样包含过程编程元素。 2. **数据...
- 聚合函数如COUNT、SUM、AVG、MAX和MIN用于对一组值进行计算,返回单个结果。 - GROUP BY语句用于根据一个或多个列对结果进行分组,常与聚合函数结合使用。 3. **窗口函数** - 窗口函数(Window Function)允许...
单行函数对单个记录进行操作,并返回一个结果,而组函数则对一组记录执行操作,返回单个值。这些内建函数极大地扩展了SQL的功能,使得对数据的操作更加灵活和强大。 表和视图是数据库中存储数据的基本结构。表代表...