新手到PL/SQL.我有几个问题,所以这里是我正在尝试做的一个例子.
CREATE OR REPLACE PROCEDURE "my_procedure" (
"my_inparam1" IN VARCHAR2,
"my_inparam2" IN VARCHAR2,
"my_output" OUT SYS_REFCURSOR)
AS
sql_text VARCHAR2 (10000);
BEGIN
sql_text :=
'select something
from my_table
where 1 = 1';
IF '&my_inparam1' <> 'foo'
THEN
sql_text := sql_text || ' and something = 0';
END IF;
IF '&my_inparam1' = 'foo' and '&my_inparam2' = 'bar'
THEN
sql_text := sql_text || ' and somethingelse = 1';
ELSIF '&my_inparam1' = 'foo' AND '&my_inparam2' = 'baz'
THEN
sql_text := sql_text || ' and …Run Code Online (Sandbox Code Playgroud) 我似乎无法找出为什么这个正则表达式不起作用PL/SQL.
if ( REGEXP_LIKE(v,'/^(?>(?>([a-f0-9]{1,4})(?>:(?1)){7}|(?!(?:.*[a-f0-9](?>:|$)){8,})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f0-9]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(?>\.(?4)){3}))$/iD') ) then
Run Code Online (Sandbox Code Playgroud)
这是用于验证IPv4和IPv6,它来自这里:https://stackoverflow.com/a/1934546/3112803
不确定这是否与它有关但我也问过这个问题关于最后的D标志:这个正则表达式(RegEx)标志意味着什么/ iD
出于某种原因,这个正则表达式适用于我在本网站上的大部分测试:http://regex101.com/但在PL/SQL一切都无效.
我的意思最的是,有一些情况下,我觉得很失败,但我一直在寻找了几天,这是最好的一个我能找到的是在512个字符(512是限制使用时REGEXP_LIKE的PL/SQL)
我很感激任何帮助.谢谢!
这些是我正在使用的测试用例......
{1: Initial address, regex should say valid/match}
select isValid('2001:0db8:0000:0000:0000:ff00:0042:8329','ipv6') from dual;
{2: After removing all leading zeroes, regex should say valid/match}
select isValid('2001:db8:0:0:0:ff00:42:8329','ipv6') from dual;
{3: After omitting consecutive sections of zeroes, regex should say valid/match}
select isValid('2001:db8::ff00:42:8329','ipv6') from dual;
{4: The loopback address, regex …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个触发器来检查我的emp_mb表中是否已存在员工,并且我收到此错误消息
ORA-00969:缺少ON关键字
有任何想法吗 ?
CREATE OR REPLACE TRIGGER adduser_mb
BEFORE
INSERT OR UPDATE emp_id
ON emp_mb
FOR EACH ROW
DECLARE
DUMMY INTEGER;
BEGIN
SELECT COUNT(*) INTO DUMMY
FROM emp_mb
WHERE emp_id = :new.emp_id
IF (dummy > 0)
THEN raise_application_error(-20501
'Employee ID' || :new.emp_id || ' already exists');
END IF;
END;
Run Code Online (Sandbox Code Playgroud) 我正在开发一个应用程序,用于跟踪Apex学校的学生上课情况.我想创建一个包含三级级联选择列表的页面,因此教师可以先选择学期,然后选择主题,然后选择该主题的特定类,以便应用程序返回已注册该类的学生.
我的问题是这三个表之间有多对多的关系,所以我使用额外的表和它们的键.每个学期都有许多科目,并且可以在许多学期教授科目.每个学期每个学科都有很多课程.学生必须每学期注册一个科目,然后教师可以将他们分配到一个班级.
表格看起来像这样:
create table semester(
id number not null,
name varchar2(20) not null,
primary key(id)
);
create table subject(
id number not null,
subject_name varchar2(50) not null,
primary key(id)
);
create table student(
id number not null,
name varchar2(20),
primary key(id)
);
create table semester_subject(
id number not null,
semester_id number not null,
subject_id number not null,
primary key(id),
foreign key(semester_id) references semester(id),
foreign key(subject_id) references subject(id),
constraint unique sem_sub_uq unique(semester_id, subject_id)
);
create table class(
id number not …Run Code Online (Sandbox Code Playgroud) 在PL/SQL过程中,我经常将语句包装在一个块中(即开始...结束),以便我可以从该语句中隔离异常.例如,如果我正在执行可能引发"no_data_found"的select,我可以在知道异常是由该语句引发的情况下处理它,但是让其他异常传播到该过程的主异常处理程序.
我想知道的是,这些额外的块是否会对性能产生任何影响.我知道引发异常会对性能产生影响,所以我从不依赖异常作为控制流机制.但块本身是否有任何影响?
例如,如果这个性能有任何差异:
procedure do_something
as
declare
some_var number;
begin
select some_value into some_var from some_table;
exception
when others then
raise_application_error(-20000, 'Exception: ' || sqlerrm, true);
end do_something;
Run Code Online (Sandbox Code Playgroud)
还有这个:
procedure do_something
as
declare
some_var number;
begin
begin
select some_value into some_var from some_table;
exception
when no_data_found then
some_var := -23; --some default value
end;
exception
when others then
raise_application_error(-20000, 'Exception: ' || sqlerrm, true);
end do_something;
Run Code Online (Sandbox Code Playgroud)
(我知道这段代码是荒谬的,但我希望它能说明我的意思!)
我真正关心的是没有引发异常时的性能 - 当出现异常时我可以接受性能下降.
关于如何从APEX调用存储过程而不仅仅是使用简单的DB-Link,是否有"最佳实践"?
我是PL/SQL新手并尝试使用CURSOR.我想验证一个插入过程,所以我写了另一个程序来这样做.
CREATE OR REPLACE PROCEDURE verify_insert
IS
CURSOR map_cur IS
SELECT Page_ID_NBR, Page_Type, Page_Dcpn FROM SSC_Page_Map;
map_rec map_cur%ROWTYPE;
BEGIN
OPEN map_cur;
FOR map_rec in map_cur
LOOP
DBMS_OUTPUT.PUT_LINE('ID: ' || map_cur.Page_ID_NBR || ' ' || 'Type' || map_cur.Page_Type || ' ' || 'Description' || map_cur.Page_Dcpn);
END LOOP;
CLOSE map_cur;
END;
SHOW ERRORS PROCEDURE verify_insert;
Run Code Online (Sandbox Code Playgroud)
我收到以下消息
[Warning] ORA-24344: success with compilation error
19/44 PLS-00225: subprogram or cursor 'MAP_CUR' reference is out of scope
19/5 PL/SQL: Statement ignored
(47: 0): Warning: compiled but …Run Code Online (Sandbox Code Playgroud) 我正在研究Oracle 11g数据库查询,该查询需要检索表中重复行之间的最高NUM值的列表.
以下是我的上下文示例:
ID | NUM
------------
1 | 1111
1 | 2222
2 | 3333
2 | 4444
3 | 5555
3 | 6666
Run Code Online (Sandbox Code Playgroud)
这是执行查询后我期望的结果:
NUM
----
2222
4444
6666
Run Code Online (Sandbox Code Playgroud)
我知道如何在一个数字列表中获取GREATEST值,但我完全没有猜测如何对两行进行分组,如果它们具有相同的ID,则获取它们之间的最大列值.
Programmaticaly它很容易实现,但使用SQL它对我来说往往不那么直观.欢迎任何建议或建议,因为我甚至不知道哪个功能可以帮助我在Oracle中这样做.
谢谢 !
所以我有一个存储过程 ONE
create or replace PROCEDURE ONE
(
A in number
B in number
...
ZZ out SYS_REFCURSOR
) IS
SOME_OTHER_STUFF
BEGIN
...
END
Run Code Online (Sandbox Code Playgroud)
这将返回一个sys_refcursor,其中包含我需要的一些数据.然后我有一个存储过程TWO
create or replace PROCEDURE TWO
(
A in number
B in number
...
ZZ out SYS_REFCURSOR
) IS
Count_Records Sys_Refcursor;
l_rec Count_Records%rowtype;
BEGIN
/* get some data from the ONE stored procedure to use on this procedure*/
ONE(A,B,...Count_Records)
Loop
fetch count_records into l_rec;
Exit When count_records%Notfound;
If l_rec.TT_RAW > MAX_RECORDS Then
Raise To_Many_Results;
End …Run Code Online (Sandbox Code Playgroud) 我在oracle 11g中写了一个游标,如下所示:
DECLARE CURSOR QnA_cursor IS
SELECT activity_id, question, answer
FROM TABLE1
WHERE question != 'surveyText'
ORDER BY activity_id, question;
cur_count INT := 1;
que NVARCHAR2(10);
ans NVARCHAR2(10);
sqlCommand NVARCHAR2(500);
RowCountVar INT;
BEGIN
FOR QueAns
IN QnA_cursor
LOOP
IF cur_count = 4 THEN cur_count := 1; END IF; /* We have only 3 questions for each activity_id */
que := 'question' || cur_count; /* question1, question2, question3 */
ans := 'answer' || cur_count; /* answer1, answer2, answer3 */
sqlCommand := …Run Code Online (Sandbox Code Playgroud) plsql ×10
oracle ×8
oracle-apex ×3
sql ×3
oracle11g ×2
cursor ×1
dynamicquery ×1
exception ×1
ipv6 ×1
regex ×1
syntax-error ×1
toad ×1
triggers ×1