相关文章推荐
打篮球的蛋挞  ·  【IJTCS ...·  1 月前    · 
阳刚的路灯  ·  WinForm中(C#) ...·  5 月前    · 

ORACLE  将表名作为变量

(记录一下我最近做的事情,从有想法到实验成功)

使用 Oracle编写存储过程 ,操作一样  但是就是表名不一样  想把表名作为变量赋值 来做循环( 实例

经常使用的存储过程中,变量可以直接放在里面:(插入更新都是可以直接使用变量作为条件)

以下都是随机编写的简单例子,只是用来说明一下正确写法。

create or replace procedure cheshi
V_A   varchar2(20);
begin
V_A:='12';
select * from CESHI where T1 = V_A ;
update CESHI set T1 = V_A ;

但是当想用变量作为表名的话,就不能使用这样的写法  所以使用动态sql ,基本的动态sql使用拼连条件变量:(使用 " || " 拼连变量

create or replace procedure cheshi
v_sql    varchar2(2000);
V_A   varchar2(20);
begin
V_A:='12';
v_sql := 'select * from CESHI where T1 ='|| V_A ;
execute immediate v_sql;

所以使用表名作为变量:这样就成功可以将表名作为变量啦!!

create or replace procedure(s OUT sys_refcursor)
  v_sql    varchar2(2000);
  v_t_name varchar2(100);
  V_A   varchar2(20);
begin
  v_t_name:='CESHI';
  v_sql := 'select * from' || v_t_name || ' WHERE T2='|| V_A ;
 open s for v_sql;

但是我的需求不仅要将变量作为表名,还想要将查询的结果赋给变量,刚开始想法是

能编译成功,但是执行的话会提示语句不正确,主要原因还是因为   sql里面是不能这样写的

正确的写法应该是:execute immediate v_sql into V_A;(执行结果赋给变量)

create or replace procedure cheshi(out_avg OUT varchar)
  v_sql    varchar2(2000);
  v_t_name varchar2(100);
  V_A   varchar2(20);
begin
  V_A:='12';
  v_t_name:='CESHI';
  v_sql := 'select count(1) from ' || v_t_name || ' where T1 ='|| V_A ;
execute immediate v_sql into V_A;
 out_avg:=V_A;
 dbms_output.put_line(out_avg);

执行结果:

啊啊啊啊  在转到我正式的存储过程写的时候遇到了很多问题,全部都是编译成功,执行的时候提示

1、sql command not properly ended

2、keyword not found where expected 

这两个问题都是sql语句不成确的问题   首先要检查sql语句   检查完发现该有的都有了 自己拿出来替换变量也能查询

最后发现问题是  没有空格 !!!吐血!!!   就是动态sql语句里面逗号和关键词之间必须要有距离!!!上面两个错误都是因为这个原因!!!(当然是你的语句本来就没有问题的前提下

还有遇到一个错误、加入时间条件的时候: 正常的动态sql 不能像如下(下图错误写法示例 | )直接写入条件里面,因为逗号之间会影响

所以我本来想法是把DD定义成一个变量,使用变量传进去 如下(下图错误写法示例 | ),使用以上的传参方法

以上两个方法 这样子  编译成功  但是测试执行的时候就会提示错误    "DD" invalid identifier

可见  这样传参进去 是不正确的

所以我改成另一个传参方法(下面这个就是正确写法啦!!!

 可能正常条件可以直接使用变量    但是条件中使用函数的变量值还是用第二种传参方式吧...

执行的时候   会提示第6行和第9行:plsql00428:select 里面缺少into子句

原理是因为:

在pl/sql程序中不允许出现不带into子句的select语句。
相当于不带into  赋值结果给变量的select语句在存储过程中是没有用的  

一般写存储过程都是根据赋值的变量判断大小  最后对数据进行增加删除修改这类操作  如果接的 是select  判断完之后就查看一下原表数据??  想当然是没有用的  

所以得改一下自己想要的存储过程的作用是什么    整个逻辑有没有问题

/*     小弟刚刚接触ORACLE存储过程,有一个问题向各位同行求教,小弟写了一个存储过程,其目的是接收一个参数作为表名,然后查询该表中的全部记录的某一个字段的内容导入到另一个表中。     (     tabname in varchar     )     is     v_servicesname tabname.服务类型%type; –这个变量就是用来存放所要取得的字段内容,但不知该如何定义     cursor curSort1 is select 服务类型 from tabname order by 编码; –此语句也不对提示找不到表名     begin     …..    正在看的ORACLE教程是:Oracle PL/SQL语言入门基础。PL/SQLORACLE对标准数据库语言的扩展,ORACLE公司已经将PL/SQL整合到ORACLE 服务器和其他工具中了,近几年中更多的开发人员和DBA开始使用PL/SQL,本文将讲述PL/SQL基础语法,结构和组件、以及如何设计并执行一个PL/SQL程序。   PL/SQL的优点   从版本6开始PL/SQL就被可靠的整合到ORACLE中了,一旦掌握PL/SQL的优点以及其独有的数据管理的便利性,那么你很难想象ORACLE缺了PL/SQL的情形。PL/SQL 不是一个独立的产品,他是一个整合到ORACLE服务器和ORAC 代码如下:SET @SQL = ‘SELECT * FROM Comment with(nolock) WHERE 1=1    And (@ProjectIds Is Null or ProjectId = @ProjectIds)    And (@Scores is null or Score =@Scores)’ 印象中记得,以前在做Oracle开发时,这种写法是会导致全表扫描的,用不上索引,不知道Sql Server里是否也是一样呢,于是做一个简单的测试1、建立测试用的表结构和索引: 代码如下:CREATE TABLE aaa(id int IDENTITY, NAME VARCHA begin SELECT '_'||TO_CHAR(SYSDATE,'MMdd') INTO BKNAME FROM DUAL; for tableName in (select distinct tabname from T0 如果你用的是 Oracle 8i 及以上的版本,那简单,在过程中用 execute immediate sql_str 就行, sql_str 是一个拼凑的 SQL 语句,但这个动态语句中带参数,或 Select 的结果要 into 到变量中时就要稍加留心一下了。而在 8i 以前的版本(谁还用这么古老的玩艺,总有些不得已的地方,老系统考虑升级成本遗留下来的,应用软件所伴随着的等),都没法用 exe... 最近需要做cs模式软件的一个报表的优化,由于软件跨平台,有三个数据库版本mysqlsqlserver、oracle,所以我要写三份功能相同的存储过程,其中表名作为变量调用proc 假设有变量 tablename 作为表名变量 ,表结构如下 接下来以求平均值为例,表名变量为tablename mysql SET @sqlStmt = CONCAT('SELECT avg(val) I...   CREATE OR REPLACE PROCEDURE 是一个SQL语句通知Oracle数据库去创建一个叫做skeleton存储过程, 如果存在就覆盖它;   IS关键词表明后面将跟随一个 ORACLE function into 变量报错 oracle 在编辑时,通常需要select 查询值后,into赋值给变量,用来判断或者定义数据,我在编辑function时,发现单独将select查询语句执行没有任何问题,但是放入函数中则直接报错了! 解决描述: 上面的问题 就是曲解了varchar的赋值,如上面的lv_csz1 拿到的数据为lv_csz1=‘a1,a2,a3,a4’ 时,就不能使用in 这个条件来查询 这样变成了一个变量 但实际这是多个值,只有采用instr 则表示我去l variable不支持日期或时间戳。最后的查询也应该使用:my_datemy_date如果目标是使用在上一步中填充的变量来填充表,那么可以使用PL/SQL来完成整个任务,例如。declaremyDate date;beginselect some_col into myDate from wherever;insert into target_table (col1, col2, col2)sel...   学习一门语言,既然学会了hello word 的输出,那就要关注下基础,首先要熟悉存储过程 中的变量类型。   关于存储过程变量有哪些 ,这样的问题,我在百度上搜索,却发现很多没用的,最近在同事那里,忽然看到一本《oracle从入门到精通》,搜了一下,发现了存储过程 的东西,但是它却没有直接叫存储过程 ,人家叫PL/SQL ,好尴尬啊。 看看PLSQL User's Guide and Reference.pdf的第十章中有讲解(8i)。下面用SQL*Plus作了些演示:[php]scott@ORCL>set autoprint onscott@ORCL>variable l_table_name varchar2(30)scott@ORCL>variable l_cur refcursorscott@ORCL&... 从powerdesigner中copy过来的sql语句,放到pl/sqldeveloper中执行执行成功后,查询数据的时候,发现select *  from a 可以查询数据,但是换成单列查询,比如 select t.id from a t 查询报异常,找不到该列,造成这种原因的很可能是从powerdesigner中copy来的sql语句有错误,就在于列名被加了一对双引号,去掉列名的双引号便可以