标签: plsql

带有常量的 Pragma Exception init

我将存储过程可能抛出的错误代码(通过调用 raise_application_error)存储为常量。我的一个程序必须捕获另一个程序抛出的错误,我正在尝试使用 pragma exception_init 来执行此操作。看起来它只接受数字文字(因为它在我收到的错误消息中明确说明了这一点),但是如果能够不硬连线我存储在常量中的错误代码,那就太好了。是否有一些解决方法,以便我可以实现与我写的相同的效果:

pragma exception_init(myException, pkg_constants.error_not_null);

oracle plsql

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

动态游标 Oracle

我想创建一个动态游标,但我的代码没有给我带来正确的数据。我究竟做错了什么?

DECLARE
 VAR1 VARCHAR2(500);
 CURSOR CUR1 IS
  SELECT T.COL1 FROM TABLE1 T WHERE T.COL1 IN (VAR1);

 BEGIN
  VAR1 := q'['V1','V2']';
  FOR REG IN CUR1 LOOP
   DBMS_OUTPUT.PUT_LINE(REG.COL1);
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

oracle plsql dynamic-sql

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

与文化无关的日期格式

我正在调用具有参数日期的 Oracle 过程。我如何指定日期的格式,以便无论 Oracle 使用哪种全球化,它都能被 Oracle 识别?

例如

create or replace procedure MyProc(p_valid_date in date) ...
Run Code Online (Sandbox Code Playgroud)

客户端调用proc,我应该如何将p_valid_date指定为字符串...?如果我使用“01212014”,即 DDMMYYYY,则它不适用于美国设置。如果我使用美国设置,则它在英国不起作用。ETC。

在 SQL Server 中,我使用 YYYYMMDD 格式,该格式是文化不变的,但我在 Oracle 文档中找不到有关文化不变格式的任何内容,并且我尝试过的所有格式似乎总是与文化绑定。

更新 我不想使用函数,因为我的客户端进行纯过程调用。这是我的客户的限制。我知道我可以将参数更改为字符串,然后在过程中使用 to_date 转换字符串,但这似乎是一个非常糟糕的设计。

谢谢

oracle plsql

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

清除 DBMS_SQL.VARCHAR2S 变量

我们如何清除DBMS_SQL.VARCHAR2S变量以便可以重用它?声明如下:

DECLARE
   l_updt_stmnt            DBMS_SQL.VARCHAR2S;

BEGIN
   Open LOOP
    l_updt_stmnt(1) := 'some dynamic sql statements';
    <parse the above statement>
   Close LOOP;

EXCEPTION
WHEN OTHERS THEN
  <Print statement>
END;
Run Code Online (Sandbox Code Playgroud)

我只是想l_updt_stmnt多次重用生成动态sql语句。

任何人都可以帮忙吗?

oracle plsql

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

在 oracle 包规范中创建类似字典的值集合

假设我有一个封装规格。存储常量值,这些常量值广泛用于其他包(主要是它们的过程) - 比如自定义错误消息、特定值,甚至列表之类的东西

TYPE myTableType IS TABLE OF VARCHAR2(100); myObj mytype := NEW myTableType ('value1','value2')

然而,我现在想添加一个完整的“字典”结构 - 所以该包中的键->值对的列表。

似乎我无法初始化该部分中的记录表,正如此处已经询问的那样: https: //asktom.oracle.com/pls/asktom/f ?p=100:11%3A0%3A%3A%3A%3AP11_QUESTION_ID:14334298866128 链接中提到的对象表似乎也不是我的解决方案。不确定什么是某种最好的解决方法。

有任何想法吗 ?

plsql

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

Oracle - 迭代表并检查属性中的值

对于 X 中的所有表,而 X 是

select table_name from all_tab_cols
where column_name = 'MY_COLUMN'
and owner='ADMIN'
Run Code Online (Sandbox Code Playgroud)

我需要检查列 MY_COLUMN 是否具有“Y”或“N”以外的其他值,如果有,则打印出表名称。

伪代码:

for table in X:
    if MY_COLUMN !='Y' or MY_COLUMN !='N':
        print table
Run Code Online (Sandbox Code Playgroud)

我想如何在 PL/SQL 中使用游标来实现它?

sql oracle plsql cursor

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

使用 FETCH 的 PL/SQL 游标 FOR 循环

我正在尝试帮助我的朋友完成 Oracle 作业,但他遇到了以下问题:

如果博客 id 小于 4,则使用游标 FOR 循环检索博客 id、博客 url 和博客描述,并将其放入游标变量中。获取并处理每条记录,并在表日志中为返回的每个博客 ID 插入一行。

我们发现很难理解,但我们有疑问:

DECLARE
    CURSOR blog_cursor IS SELECT * FROM blog;
BEGIN
  FOR blog_item IN blog_cursor LOOP
    IF( blog_item.blog_id > 4 ) THEN
      -- Insert a row in the "table log"
      INSERT INTO log( log_id, log_url, log_desc )
      VALUES( blog_item.blog_id, blog_item.blog_url, blog_item.blog_desc );
    END IF;
  END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)

桌子:

blog
    blog_id
    blog_url
    blog_desc
Run Code Online (Sandbox Code Playgroud)

该查询完成了这项工作,但它没有使用 FETCH 关键字,因此我们认为它在技术上不正确。这个问题看起来写得不好,但是你如何使用 FETCH 关键字回答它?我是 PL/SQL 新手,但我有 SQL 经验。

sql oracle plsql

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

如何在没有空参数的情况下初始化 PL/SQL 中的记录类型

我有如下记录类型:

CREATE OR REPLACE TYPE CUSTOM_REC_TYPE AS OBJECT
(
     ID                                NUMBER(19),
     COLUMN1                           NUMBER(19),
     COLUMN2                           NUMBER(19),
     COLUMN3                           NUMBER(19),
     COLUMN4                           NUMBER(19),
     .....                                       ,
     .....                                       ,
     .....                                       ,
     .....                                       
)
Run Code Online (Sandbox Code Playgroud)

我需要初始化这种类型的记录。使用以下语法:

l_custom_rec                    :=    CUSTOM_REC_TYPE();
Run Code Online (Sandbox Code Playgroud)

不起作用。我收到消息:

PLS-00306: wrong number or types of arguments in call to 'CUSTOM_REC_TYPE'
Run Code Online (Sandbox Code Playgroud)

我想我需要将所有值作为参数传递,即:

l_custom_rec                    :=    CUSTOM_REC_TYPE(null, null, null, .....);
Run Code Online (Sandbox Code Playgroud)

我可以避免这种情况吗?有没有办法在没有这么长的初始化的情况下使用我的记录?(记录类型有 90 个组件)。如果我根本不初始化它,我会收到错误:

ORA-06530: Reference to uninitialized composite
Run Code Online (Sandbox Code Playgroud)

还有其他情况,我在包中声明类型,根本不需要初始化。这怎么可能?

plsql initialization record

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

并行执行 Oracle For 循环

我正在循环遍历表列表并更新每个表中的列列表。是否可以并行执行循环,即一次更新多个表。

  FOR Table_rec IN Table_list_cur
  LOOP
     --Check if the table is partitioned
     IF Check_if_partitioned (Table_rec.Table_name, Table_rec.Owner)
     THEN
        --If Yes, loop through each parition
        EXECUTE IMMEDIATE
              'Select partition_name from USER_TAB_PARTITIONS where table_name = '''
           || Table_rec.Table_name
           || ''' and owner = '''
           || Table_rec.Owner
           || ''''
           BULK COLLECT INTO L_part;

        FOR I IN L_part.FIRST .. L_part.LAST
        LOOP
           --Update each parition
           DBMS_OUTPUT.Put_line ('V_sql_stmt' || V_sql_stmt);
           V_sql_stmt :=
                 'UPDATE /*+ PARALLEL(upd_tbl,4) */ '
              || Table_rec.Table_name
              || ' PARTITION ('
              || L_part (I)
              || …
Run Code Online (Sandbox Code Playgroud)

oracle parallel-processing plsql for-loop

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

PL/SQL 触发器:无法创建 apex 用户

我正在开发数据库,​​剩下的最后任务之一是创建用户帐户。由于某种原因,我似乎无法让它工作。事实上,没有注释的情况下,所有注释的代码都不起作用。我们主要关心的是能够自动创建用户帐户,而不是手动创建它们。我希望有人能够阐明我的方法中的错误,以便我的代码能够编译。

create or replace TRIGGER trg_Students
BEFORE INSERT OR UPDATE OF SRN, Surname, Forename, Username, DOB, Date_Cv_Submitted, Date_cv_approved, same_address, home_phone_no, home_postcode ON Students 
FOR EACH ROW
BEGIN

IF INSERTING THEN
   :NEW.SRN := seq_SRN.nextval;

   CREATE USER :new.USERNAME
   IDENTIFIED BY PASSWORD
   PROFILE app_user
   PASSWORD EXPIRE;

    --IF (ACTIVE_ACCOUNT = 'Y' AND CV_APPROVED = NULL) THEN
    --    RAISE_APPLICATION_ERROR(-20000, 'Cannot create an account that is active before the cv is approved!');
    --END IF;        

END IF; 

--IF UPDATING THEN
    --IF (DATE_CV_APPROVED != NULL) THEN
    --:new.Active_Account := …
Run Code Online (Sandbox Code Playgroud)

sql database oracle plsql oracle-apex

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