我需要检查某个SELECT语句是否包含表中不存在的字段(列),例如:
从table1中选择col1,col2,col3
如果col1不存在,我想显示"缺少字段",而不是让用户获得无效的标识符错误.
这是我最好和最短的选择吗?
我对在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:
我真的希望我们甚至不支持其他人.
您应该只捕获您期望的异常并且可以做些什么.让其他人传播出来,这样你就可以发现它们(所以你看到它们)
所以我的问题很简单:
我是否需要一个其他的子句来记录和提升每一个,我有一些时间使用数据操作语言(例如插入/更新/删除)?如果没有,我什么时候想避开它?
我的代码片段当前使用以下代码将数据提取到对象中:
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)
这将由执行立即运行.
有没有办法加速这段代码?
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,但那是为了已经存在的数据集合..对我来说真的没什么用.所以我想知道是否有比经典循环更好的方法,或者至少我可以做的其他一些改进(比如在我创建表时添加/删除一些选项),任何能够让它运行得更快的东西.
提前致谢!
我有一个逗号分隔值的文件,如下所示:
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)
将返回逗号的数量,但是这将在第一行中计算额外的逗号而不是第二行,为此我们应该将它们计为具有相同的数字.
是否有任何快速简单的方法可以忽略引号中的逗号?
我知道我可以创建一个循环并开始按位分解字符串,计算它们,每当我找到引号时忽略任何逗号,直到找到另一个引号,但是我想知道是否有更简单,更简化的方式在不诉诸循环的情况下实现这一点.
非常感谢!
我有一个考试,并有一个规格,我不知道这意味着什么.请给我一个提示或给我一个简短的例子.
规范:自动执行包启动时的代码:
满足条件:编写的代码自动初始化变量而无需用户显式调用.
我不确定这是否被问到,但是我必须像这样调用包:PACKAGE_NAME.function_name所以没有值的调用?那是什么问题?
如果是这样,你不需要进一步帮助我,因为我知道该怎么做.
这在面试中被问到.问题是,哪一个更快,FORALL在5000或在500记录上使用FOR?好吧,我认为就处理速度而言,FORALL确实更快但仍依赖于要处理的行数,就像上面的问题一样.请分享你的想法.
我想知道,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
我有这样的代码:
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) 我试图删除两个相关表中的数据 - 表中的主键和表中的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 ×10
plsql ×10
sql ×4
count ×1
dynamic-sql ×1
exception ×1
for-loop ×1
oracle11g ×1
packages ×1
performance ×1
regex ×1
sql-delete ×1
string ×1