我将存储过程可能抛出的错误代码(通过调用 raise_application_error)存储为常量。我的一个程序必须捕获另一个程序抛出的错误,我正在尝试使用 pragma exception_init 来执行此操作。看起来它只接受数字文字(因为它在我收到的错误消息中明确说明了这一点),但是如果能够不硬连线我存储在常量中的错误代码,那就太好了。是否有一些解决方法,以便我可以实现与我写的相同的效果:
pragma exception_init(myException, pkg_constants.error_not_null);
我想创建一个动态游标,但我的代码没有给我带来正确的数据。我究竟做错了什么?
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 过程。我如何指定日期的格式,以便无论 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 转换字符串,但这似乎是一个非常糟糕的设计。
谢谢
我们如何清除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语句。
任何人都可以帮忙吗?
假设我有一个封装规格。存储常量值,这些常量值广泛用于其他包(主要是它们的过程) - 比如自定义错误消息、特定值,甚至列表之类的东西
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 链接中提到的对象表似乎也不是我的解决方案。不确定什么是某种最好的解决方法。
有任何想法吗 ?
对于 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 中使用游标来实现它?
我正在尝试帮助我的朋友完成 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 经验。
我有如下记录类型:
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)
还有其他情况,我在包中声明类型,根本不需要初始化。这怎么可能?
我正在循环遍历表列表并更新每个表中的列列表。是否可以并行执行循环,即一次更新多个表。
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) 我正在开发数据库,剩下的最后任务之一是创建用户帐户。由于某种原因,我似乎无法让它工作。事实上,没有注释的情况下,所有注释的代码都不起作用。我们主要关心的是能够自动创建用户帐户,而不是手动创建它们。我希望有人能够阐明我的方法中的错误,以便我的代码能够编译。
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) plsql ×10
oracle ×8
sql ×3
cursor ×1
database ×1
dynamic-sql ×1
for-loop ×1
oracle-apex ×1
record ×1