标签: plsql

如何在pl/sql中处理invalid_identifier异常?

我需要检查某个SELECT语句是否包含表中不存在的字段(列),例如:

从table1中选择col1,col2,col3

如果col1不存在,我想显示"缺少字段",而不是让用户获得无效的标识符错误.

这是我最好和最短的选择吗?

oracle plsql exception dynamic-sql

1
推荐指数
1
解决办法
2240
查看次数

所有DML的其他异常处理时我需要吗?

我对在Oracle中处理未知异常的最佳实践感到困惑.

我可以这样做:

BEGIN
    --do something
EXCEPTION
WHEN NO_DATA_FOUND THEN
    raise_application_error etc
WHEN OTHERS THEN
    raise;
END;
Run Code Online (Sandbox Code Playgroud)

这似乎是在一些博客和网站上推荐的,甚至在Oracle文档中也有讨论:

通过在每个PL/SQL程序的顶层包含OTHERS异常处理程序来避免未处理的异常.

使OTHERS异常处理程序中的最后一个语句成为RAISE或调用RAISE_APPLICATION_ERROR过程.(如果您不遵循此惯例,并且启用了PL/SQL警告,那么您将获得PLW-06009.)有关RAISE或调用RAISE_APPLICATION_ERROR的信息,请参阅"显式提升异常".

但是我也知道在一些地方已经提到这是相当可怕的,例如Ask Tom:

我真的希望我们甚至不支持其他人.

您应该只捕获您期望的异常并且可以做些什么.让其他人传播出来,这样你就可以发现它们(所以你看到它们)

所以我的问题很简单:

我是否需要一个其他的子句来记录和提升每一个,我有一些时间使用数据操作语言(例如插入/更新/删除)?如果没有,我什么时候想避开它?

sql oracle plsql exception-handling

1
推荐指数
1
解决办法
830
查看次数

如何在动态查询中使用批量收集?

我的代码片段当前使用以下代码将数据提取到对象中:

SELECT ORDR_LIST(ORDER_NUMBER,ORDER_TYPE,ORDER_DATE,CLIENT_ID,CLIENT_NAME) BULK COLLECT INTO P_RESULTSET
            FROM
              (SELECT ORDER_NUMBER,
                        ORDER_TYPE,
                        ORDER_DATE,
                        CLIENT_ID,
                        CLIENT_NAME
                      FROM
                        (SELECT ORDER_NUMBER,
                          ORDER_TYPE,
                          TO_CHAR(ORDER_CREATED_DATE,'YYYY-MM-DD HH:MI:SS am') AS ORDER_DATE,
                          CUSTOMER_FIRST_NAME
                          ||' '
                          ||CUSTOMER_SURNAME AS C_NAME,
                          CLIENT_ID,
                          CLIENT_NAME
                        FROM CONNECT_CUSTOMER_TRANS
                        WHERE ORDER_TYPE              =P_ORDER_TYPE
                        AND lower(CUSTOMER_SURNAME)   =lower(P_LAST_NAME)
                        AND lower(CUSTOMER_FIRST_NAME)=lower(P_FIRST_NAME)
                        AND lower(CLIENT_ID)          =lower(P_CLIENT_ID)
                        AND ORDER_CREATED_DATE BETWEEN P_FROM_DT AND P_TO_DT
  )
 WHERE C_NAME=I.CUS_NAME);
Run Code Online (Sandbox Code Playgroud)

现在我已经将select语句动态生成为变量var1.但是我无法在动态部分中实现它.

代码应如下所示:

SELECT ORDR_LIST(ORDER_NUMBER,ORDER_TYPE,ORDER_DATE,CLIENT_ID,CLIENT_NAME) BULK COLLECT INTO P_RESULTSET
            FROM var1
Run Code Online (Sandbox Code Playgroud)

这将由执行立即运行.

oracle plsql dynamic-queries oracle11g

1
推荐指数
1
解决办法
152
查看次数

有什么方法可以加快以下插入速度吗?

有没有办法加速这段代码?

FOR j IN 1..max
LOOP
  INSERT INTO myTable VALUES(DBMS_RANDOM.VALUE(1, 500), DBMS_RANDOM.VALUE(1, 500));
END LOOP;
Run Code Online (Sandbox Code Playgroud)

循环将发生至少一百万次,所以一百万+插入.我知道FORALL,但那是为了已经存在的数据集合..对我来说真的没什么用.所以我想知道是否有比经典循环更好的方法,或者至少我可以做的其他一些改进(比如在我创建表时添加/删除一些选项),任何能够让它运行得更快的东西.

提前致谢!

sql oracle plsql

1
推荐指数
2
解决办法
110
查看次数

如何计算字符串中分隔符的出现次数,不包括引号中的分隔符

我有一个逗号分隔值的文件,如下所示:

1.42104E+16,220899,1,,e-page remote auto,,,"Allied Martian Banks, P.L.C.",Moon,MN,,
1.42105E+16,637039,1,,e-page remote auto,,,Bank Of Jupiter,Europa,IO,,
Run Code Online (Sandbox Code Playgroud)

我想计算一些逗号的数量,不包括引号中的那些,例如"Allied Martian Banks,PLC".

我知道:

length(i.data_record)-length(replace(i.data_record,',',''))
Run Code Online (Sandbox Code Playgroud)

将返回逗号的数量,但是这将在第一行中计算额外的逗号而不是第二行,为此我们应该将它们计为具有相同的数字.

是否有任何快速简单的方法可以忽略引号中的逗号?

我知道我可以创建一个循环并开始按位分解字符串,计算它们,每当我找到引号时忽略任何逗号,直到找到另一个引号,但是我想知道是否有更简单,更简化的方式在不诉诸循环的情况下实现这一点.

非常感谢!

regex string oracle plsql count

1
推荐指数
1
解决办法
427
查看次数

在程序包启动时自动执行代码

我有一个考试,并有一个规格,我不知道这意味着什么.请给我一个提示或给我一个简短的例子.

规范:自动执行包启动时的代码:

满足条件:编写的代码自动初始化变量而无需用户显式调用.

我不确定这是否被问到,但是我必须像这样调用包:PACKAGE_NAME.function_name所以没有值的调用?那是什么问题?

如果是这样,你不需要进一步帮助我,因为我知道该怎么做.

oracle plsql packages

1
推荐指数
1
解决办法
907
查看次数

FORALL与FOR批量更新

这在面试中被问到.问题是,哪一个更快,FORALL在5000或在500记录上使用FOR?好吧,我认为就处理速度而言,FORALL确实更快但仍依赖于要处理的行数,就像上面的问题一样.请分享你的想法.

sql oracle performance plsql

1
推荐指数
1
解决办法
5477
查看次数

PL/SQL中for循环的最大值

我想知道,for循环语句中的最大值是多少?是数据类型NUMBER吗?

BEGIN
  -- Bounds are numeric literals:
  FOR j IN 1..5000 LOOP
    NULL;
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

我需要最多3x10 ^ 14

oracle plsql for-loop

1
推荐指数
1
解决办法
987
查看次数

大量游标,一个流水线功能

我有这样的代码:

CREATE OR REPLACE TYPE person_typ AS OBJECT (ssn NUMBER(9), 
name VARCHAR2(30), address VARCHAR2(100));

CREATE OR REPLACE TYPE t_tab AS TABLE OF person_typ;

CREATE OR REPLACE FUNCTION my_pipe(p_in VARCHAR2) RETURN t_tab PIPELINED IS
     rec person_typ;

     CURSOR cur1 IS
          SELECT ssn, name, address FROM /* ... complex query */

     CURSOR cur2 IS
          SELECT ssn, name, address FROM /* ... complex query */

     CURSOR cur3 IS
          SELECT ssn, name, address FROM /* ... complex query */

     CURSOR cur4 IS
          SELECT ssn, name, …
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql

1
推荐指数
1
解决办法
78
查看次数

ORA-00933:同时删除两个表时SQL命令未正确结束

我试图删除两个相关表中的数据 - 表中的主键和表中的users外键login- 但我收到错误PL/SQL: ORA-00933: SQL command not properly ended.

创建表users和主键:

/* table user*/
create table users (id_user number(10) not null, 
                    name_user varchar(30) not null);
/* primary key */
alter table users add constraint user_pk primary key (id_user);
Run Code Online (Sandbox Code Playgroud)

创建表login和主键以及外键:

/* table login*/
create table login (id_login number(10) not null, 
                    id_user_login number(10) not null, 
                    email_login varchar(20) not null,
                    password_login varchar(20) not null);
/* primary key */
alter table login add constraint …
Run Code Online (Sandbox Code Playgroud)

oracle plsql sql-delete

1
推荐指数
1
解决办法
1287
查看次数