标签: plsql

必须声明pl/sql PLS-00201标识符

新手到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)

oracle plsql stored-procedures syntax-error

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

IPv6正则表达式(RegEx)在PL/SQL中不起作用

我似乎无法找出为什么这个正则表达式不起作用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)

regex oracle plsql ipv6

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

触发检查新员工不存在

我正在尝试创建一个触发器来检查我的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)

oracle triggers plsql oracle-apex

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

具有多对多关系的级联值列表

我正在开发一个应用程序,用于跟踪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)

plsql oracle-apex

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

嵌套块在PL/SQL过程中是否会对性能产生影响?

在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)

(我知道这段代码是荒谬的,但我希望它能说明我的意思!)

我真正关心的是没有引发异常时的性能 - 当出现异常时我可以接受性能下降.

oracle plsql exception

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

APEX调用外部存储函数或存储过程

关于如何从APEX调用存储过程而不仅仅是使用简单的DB-Link,是否有"最佳实践"?

oracle plsql oracle-apex

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

Pl/SQL过程CURSOR For循环

我是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)

toad plsql oracle11g

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

如何获取重复行ID之间的最大列值?

我正在研究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中这样做.

谢谢 !

sql oracle plsql oracle11g

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

在存储过程中声明SYS_REFCURSOR和ROWTYPE

所以我有一个存储过程 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)

sql oracle plsql stored-procedures

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

PLS-00382:Oracle游标中的表达式类型错误

我在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)

sql oracle plsql cursor dynamicquery

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