当前位置:首页 » 编程软件 » hive编译存储过程不报错

hive编译存储过程不报错

发布时间: 2022-06-13 19:03:55

① 写了个存储过程,编译的时候通过了,执行的时候报错 提示execute immediate语句无效

create or replace procere pro_t is
cursor c is
select table_name
from user_all_tables
where table_name in (select table_name
from user_tab_columns
where column_name = 'POSITION_ID');
tablename varchar2(100);
strinsert varchar2(1000);
begin
open c;
loop
fetch c
into tablename;
exit when c%notfound;--你之前没有循环退出条件
strinsert:= 'update '|| tablename ||' set POSITION_ID =1' ;--之前sql语句拼的有问题
execute immediate strinsert;
end loop;
commit;
close c;
end;

② 存储过程 编译错误 show error 没有错误

insert into supermarket.sales_goods("TIME","BAR_CODE","PRICE","NUM")

这里为何要加 引号

③ Oracle 存储过程不能执行 但是不报错

无效状态有两种可能,一种是你的存储过程编辑没有成功,创建了,但里面有语法错误。
还有一种是存储过程使用的表有结构上的改变,需要重新编译一下。
你重新编译一下,如果不成功,就是有语法问题,你需要修改存储过程。

④ hive底层依赖hadoop中的哪些框架

1. 什么是hive

•Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。

•本质是将HQL转换为MapRece程序

2. 为什么使用hive

•操作接口采用类SQL语法,提供快速开发的能力

•避免了去写MapRece,减少开发人员的学习成本

•扩展功能很方便

3. hive 特点

•可扩展

Hive可以自由的扩展集群的规模,一般情况下不需要重启服务

•延展性

Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数

•容错

良好的容错性,节点出现问题SQL仍可完成执行

4. hive 与hadoop 关系

发出HQL —> hive 转换成maprece—> maprece—> 对hdfs进行操作

5. hive 与传统数据对比

Hive

RDBMS

查询语言

HQL

SQL

数据存储

HDFS

Raw Device or Local FS

执行

MapRece

Excutor

执行延迟

处理数据规模

索引

0.8版本后加入位图索引

有复杂的索引

6. hive 的未来

•增加更多类似传统数据库的功能,如存储过程

•提高转换成的MapRece性能

•拥有真正的数据仓库的能力

•UI部分加强

Hive是基于Hadoop平台的,它提供了类似SQL一样的查询语言HQL。有了Hive,如果使用过SQL语言,并且不理解Hadoop MapRece运行原理,也就无法通过编程来实现MR,但是你仍然可以很容易地编写出特定查询分析的HQL语句,通过使用类似SQL的语法,将HQL查询语句提交Hive系统执行查询分析,最终Hive会帮你转换成底层Hadoop能够理解的MR Job。
对于最基本的HQL查询我们不再累述,这里主要说明Hive中进行统计分析时使用到的JOIN操作。在说明Hive JOIN之前,我们先简单说明一下,Hadoop执行MR Job的基本过程(运行机制),能更好的帮助我们理解HQL转换到底层的MR Job后是如何执行的。我们重点说明MapRece执行过程中,从Map端到Rece端这个过程(Shuffle)的执行情况,如图所示(来自《Hadoop: The Definitive Guide》)

基本执行过程,描述如下:

  • 一个InputSplit输入到map,会运行我们实现的Mapper的处理逻辑,对数据进行映射操作。
  • map输出时,会首先将输出中间结果写入到map自带的buffer中(buffer默认大小为100M,可以通过io.sort.mb配置)。
  • map自带的buffer使用容量达到一定门限(默认0.80或80%,可以通过io.sort.spill.percent配置),一个后台线程会准备将buffer中的数据写入到磁盘。
  • 这个后台线程在将buffer中数据写入磁盘之前,会首先将buffer中的数据进行partition(分区,partition数为Recer的个数),对于每个的数据会基于Key进行一个in-memory排序。
  • 排序后,会检查是否配置了Combiner,如果配置了则直接作用到已排序的每个partition的数据上,对map输出进行化简压缩(这样写入磁盘的数据量就会减少,降低I/O操作开销)。
  • 现在可以将经过处理的buffer中的数据写入磁盘,生成一个文件(每次buffer容量达到设置的门限,都会对应着一个写入到磁盘的文件)。
  • map任务结束之前,会对输出的多个文件进行合并操作,合并成一个文件(若map输出至少3个文件,在多个文件合并后写入之前,如果配置了Combiner,则会运行来化简压缩输出的数据,文件个数可以通过min.num.splits.for.combine配置;如果指定了压缩map输出,这里会根据配置对数据进行压缩写入磁盘),这个文件仍然保持partition和排序的状态。
  • rece阶段,每个rece任务开始从多个map上拷贝属于自己partition(map阶段已经做好partition,而且每个rece任务知道应该拷贝哪个partition;拷贝过程是在不同节点之间,Recer上拷贝线程基于HTTP来通过网络传输数据)。
  • 每个rece任务拷贝的map任务结果的指定partition,也是先将数据放入到自带的一个buffer中(buffer默认大小为Heap内存的70%,可以通过mapred.job.shuffle.input.buffer.percent配置),如果配置了map结果进行压缩,则这时要先将数据解压缩后放入buffer中。
  • rece自带的buffer使用容量达到一定门限(默认0.66或66%,可以通过mapred.job.shuffle.merge.percent配置),或者buffer中存放的map的输出的数量达到一定门限(默认1000,可以通过mapred.inmem.merge.threshold配置),buffer中的数据将会被写入到磁盘中。
  • 在将buffer中多个map输出合并写入磁盘之前,如果设置了Combiner,则会化简压缩合并的map输出。
  • 当属于该recer的map输出全部拷贝完成,则会在recer上生成多个文件,这时开始执行合并操作,并保持每个map输出数据中Key的有序性,将多个文件合并成一个文件(在rece端可能存在buffer和磁盘上都有数据的情况,这样在buffer中的数据可以减少一定量的I/O写入操作开销)。
  • 最后,执行rece阶段,运行我们实现的Recer中化简逻辑,最终将结果直接输出到HDFS中(因为Recer运行在DataNode上,输出结果的第一个replica直接在存储在本地节点上)。
  • 通过上面的描述我们看到,在MR执行过程中,存在Shuffle过程的MR需要在网络中的节点之间(Mapper节点和Recer节点)拷贝数据,如果传输的数据量很大会造成一定的网络开销。而且,Map端和Rece端都会通过一个特定的buffer来在内存中临时缓存数据,如果无法根据实际应用场景中数据的规模来使用Hive,尤其是执行表的JOIN操作,有可能很浪费资源,降低了系统处理任务的效率,还可能因为内存不足造成OOME问题,导致计算任务失败。
    下面,我们说明Hive中的JOIN操作,针对不同的JOIN方式,应该如何来实现和优化:

    生成一个MR Job

    多表连接,如果多个表中每个表都使用同一个列进行连接(出现在JOIN子句中),则只会生成一个MR Job,例如:

    1 SELECTa.val, b.val, c.valFROMaJOINbON(a.key= b.key1)JOINcON(c.key= b.key1)

    三个表a、b、c都分别使用了同一个字段进行连接,亦即同一个字段同时出现在两个JOIN子句中,从而只生成一个MR Job。

    生成多个MR Job

    多表连接,如果多表中,其中存在一个表使用了至少2个字段进行连接(同一个表的至少2个列出现在JOIN子句中),则会至少生成2个MR Job,例如:

    1 SELECTa.val, b.val, c.valFROMaJOINbON(a.key= b.key1)JOINcON(c.key= b.key2)

    三个表基于2个字段进行连接,这两个字段b.key1和b.key2同时出现在b表中。连接的过程是这样的:首先a和b表基于a.key和b.key1进行连接,对应着第一个MR Job;表a和b连接的结果,再和c进行连接,对应着第二个MR Job。

⑤ 关于sqlserver存储过程的编译的问题

只编译一次。
在发布存储过程时就编译一次,页面上只要调用就可以,两次打开就是调用两次存储过程

⑥ 数据库存储过程编译出错

可用第三方工具检查错误。

如以下存储过程:

⑦ oralce 存储过程编译时不会出现红叉但在执行一段时间后总是会出现红叉

这是由于有些数据库对象可能被你变更了,比如表结构某个字段改变了类型,删除了一下字段,可能对你程序本身并没有影响,但是存储过程会认为你这需要重新编译,才能够运行。。

⑧ 我写了一个存储过程,编译通过,可是一测试就报错,不知道为什么实在是不会改,

应该是jestr这个地方报错了,jestr是字符型的,所以f47和这个拼接的格式应该是f47||'123'这样的形式,所以把jestr这个变量转化后,缺少了单引号。后边的f1字段应该也是字符型吧,也是同样的问题。

另外还发现有一个问题,oracle里面,没有UPDATE ... SET ... FROM 这样的语法,这个是SQLSERVER的语法。

EXECUTE immediate ('update T_zfjz_57g_ffb set f47=f47||'''||jestr||''' where exists (select 1 from T_zfjz_57g_hmc where T_zfjz_57g_hmc.F1=T_zfjz_57g_ffb.f2 ) and T_zfjz_57g_ffb.f1= '''||idstr||' '||wqg||'''');

⑨ 存储过程一直报错 但是编译成功了 也没有错 调用时一直不成功报错

下面是问题:
Oraclede 环境中,客户那边提出,执行存储过程时出错,信息:DBCustomException: ORA-00900: invalid SQL statement

关于这个问题之前也遇到过,一直找不到原因,没解决,时好时坏,,由于客户大部分是SQL Server,也就没太在意,现在终于麻烦来了。

我用自己创建的用户,通过P/L SQL 登陆,执行以下语句
--创建表
 create table ttt
 (
    aa varchar(20)
 )
 
 --创建存储过程
 CREATE OR REPLACE PROCEDURE   myproc  
  AS  BEGIN  
  select * from ttt;
 END 
 --执行
 exec myproc 

执行存储过程时,开始报错:ORA-00900:无效SQL语句 (上面那个错误的中文版-_-!)
这时候看右边的存储过程如下,有个红叉,

⑩ 这个存储过程哪儿犯错了,编译成功了,但执行不来,Test也没报错

你把 if startdate is not null and enddate is not null then 这句改了 改成
if (length(startdate) != 0) and (length(enddate) != 0) then

热点内容
内置存储卡可以拆吗 发布:2025-05-18 04:16:35 浏览:333
编译原理课时设置 发布:2025-05-18 04:13:28 浏览:376
linux中进入ip地址服务器 发布:2025-05-18 04:11:21 浏览:610
java用什么软件写 发布:2025-05-18 03:56:19 浏览:31
linux配置vim编译c 发布:2025-05-18 03:55:07 浏览:107
砸百鬼脚本 发布:2025-05-18 03:53:34 浏览:941
安卓手机如何拍视频和苹果一样 发布:2025-05-18 03:40:47 浏览:739
为什么安卓手机连不上苹果7热点 发布:2025-05-18 03:40:13 浏览:802
网卡访问 发布:2025-05-18 03:35:04 浏览:510
接收和发送服务器地址 发布:2025-05-18 03:33:48 浏览:371