我想打印一个匿名块内的特定变量的值.我正在使用Oracle SQL Developer.我试过用dbms_output.put_line.但它没有用.我正在使用的代码如下所示.
SET SERVEROUTPUT ON
DECLARE
CTABLE USER_OBJECTS.OBJECT_NAME%TYPE;
CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE;
V_ALL_COLS VARCHAR2(500);
CURSOR CURSOR_TABLE
IS
SELECT OBJECT_NAME
FROM USER_OBJECTS
WHERE OBJECT_TYPE='TABLE'
AND OBJECT_NAME LIKE 'tb_prm_%';
CURSOR CURSOR_COLUMNS (V_TABLE_NAME IN VARCHAR2)
IS
SELECT COLUMN_NAME
FROM ALL_TAB_COLS
WHERE TABLE_NAME = V_TABLE_NAME;
BEGIN
OPEN CURSOR_TABLE;
LOOP
FETCH CURSOR_TABLE INTO CTABLE;
EXIT WHEN CURSOR_TABLE%NOTFOUND;
OPEN CURSOR_COLUMNS (CTABLE);
V_ALL_COLS := NULL;
LOOP
FETCH CURSOR_COLUMNS INTO CCOLUMN;
V_ALL_COLS := V_ALL_COLS || CCOLUMN;
IF CURSOR_COLUMNS%FOUND THEN
V_ALL_COLS := V_ALL_COLS || ', ';
ELSE
EXIT; …Run Code Online (Sandbox Code Playgroud) 对某人来说非常容易,以下插页给了我
ORA-01722:无效的号码
为什么?
INSERT INTO CUSTOMER VALUES (1,'MALADY','Claire','27 Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (2,'GIBSON','Jake','27 Smith St Caulfield','0415 713 598');
INSERT INTO CUSTOMER VALUES (3,'LUU','Barry','5 Jones St Malvern','0413 591 341');
INSERT INTO CUSTOMER VALUES (4,'JONES','Michael','7 Smith St Caulfield','0419 853 694');
INSERT INTO CUSTOMER VALUES (5,'MALADY','Betty','27 Smith St Knox','0418 418 347');
Run Code Online (Sandbox Code Playgroud) 对于INSERT,UPDATE和DELETESQL直接对数据库执行的语句,大多数数据库提供商返回受影响的行数.对于存储过程,受影响的记录数始终为-1.
我们如何获得受存储过程影响的记录数?
执行以下代码时,它只是说过程已完成,并且不打印我想要的信息(firstName,lastName),然后是下表中select查询的其他值.
CREATE OR REPLACE PROCEDURE PRINT_ACTOR_QUOTES (id_actor char)
AS
CURSOR quote_recs IS
SELECT a.firstName,a.lastName, m.title, m.year, r.roleName ,q.quotechar from quote q, role r,
rolequote rq, actor a, movie m
where
rq.quoteID = q.quoteID
AND
rq.roleID = r.roleID
AND
r.actorID = a.actorID
AND
r.movieID = m.movieID
AND
a.actorID = id_actor;
BEGIN
FOR row IN quote_recs LOOP
DBMS_OUTPUT.PUT_LINE('a.firstName' || 'a.lastName');
end loop;
END PRINT_ACTOR_QUOTES;
/
Run Code Online (Sandbox Code Playgroud)
当设置服务器输出时,我得到
a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName
a.firstNamea.lastName
Run Code Online (Sandbox Code Playgroud)
多次!
我有一个数据库,在字段上有一个NOT NULL约束,我想删除这个约束.复杂因素是此约束具有系统定义的名称,并且该约束的名称在生产服务器,集成服务器和各种开发人员数据库之间不同.我们当前的过程是检入更改脚本,并且自动化任务通过sqlplus对目标数据库执行适当的查询,因此我更喜欢可以直接发送到sqlplus的解决方案.
在我自己的数据库中,删除它的SQL将是:
alter table MYTABLE drop constraint SYS_C0044566
Run Code Online (Sandbox Code Playgroud)
查询all_constraints视图时,我可以看到约束:
select * from all_constraints where table_name = 'MYTABLE'
Run Code Online (Sandbox Code Playgroud)
但我不知道如何配合工作SEARCH_CONDITION的LONG数据类型或如何最好地动态删除即使我知道它的名字查找到的约束.
那么,我如何创建一个更改脚本,可以根据它的内容而不是它的名称来删除这个约束?
编辑:@ Allan的回答很好,但我担心(由于我缺乏Oracle的专业知识),任何可能具有系统生成名称的约束都可能与其相关联,这可能并不普遍.约束而不必知道它的名字.在逻辑上删除该约束时,总会有一种方法可以避免必须知道系统命名约束的名称吗?
是否可以创建用户定义的异常并能够更改SQLERRM?
例如:
DECLARE
ex_custom EXCEPTION;
BEGIN
RAISE ex_custom;
EXCEPTION
WHEN ex_custom THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/
Run Code Online (Sandbox Code Playgroud)
输出是"用户定义的例外".是否可以更改该消息?
编辑:这里有一些更详细的信息.
我希望这个说明我想要做得更好.
DECLARE
l_table_status VARCHAR2(8);
l_index_status VARCHAR2(8);
l_table_name VARCHAR2(30) := 'TEST';
l_index_name VARCHAR2(30) := 'IDX_TEST';
ex_no_metadata EXCEPTION;
BEGIN
BEGIN
SELECT STATUS
INTO l_table_status
FROM USER_TABLES
WHERE TABLE_NAME = l_table_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN
-- raise exception here with message saying
-- "Table metadata does not exist."
RAISE ex_no_metadata;
END;
BEGIN
SELECT STATUS
INTO l_index_status
FROM USER_INDEXES
WHERE INDEX_NAME = l_index_name;
EXCEPTION
WHEN NO_DATA_FOUND THEN …Run Code Online (Sandbox Code Playgroud) 有没有办法只运行一次查询以选择变量,考虑到查询可能什么都不返回,那么在这种情况下变量应该为null.
目前,我无法select into直接执行变量,因为如果查询什么都不返回,PL/SQL会抱怨变量没有设置.我只能运行查询两次,第一个执行计数,如果计数为零,则将变量设置为null,如果计数为1,则选择变量.
所以代码就像:
v_column my_table.column%TYPE;
v_counter number;
select count(column) into v_counter from my_table where ...;
if (v_counter = 0) then
v_column := null;
elsif (v_counter = 1) then
select column into v_column from my_table where ...;
end if;
Run Code Online (Sandbox Code Playgroud)
谢谢.
更新:我没有使用异常的原因是我在分配之后仍然有一些跟随逻辑v_column,我必须goto在异常部分中使用跳转回以下代码.我有点犹豫不决goto.
我试图saveOrUpdate()在休眠中调用来保存数据.由于列具有唯一索引,因此ConstraintViolationException当我通过Eclipse调试器查看时它会抛出.
由于在将数据插入表时,根本原因可能因异常而异.
我想知道,如何循环/遍历getCause()以检查异常的根本原因及其消息.
更新:
感谢大家的回复,我希望输出如下图所示:

我需要访问 detailMessage字段.
(我真的很抱歉,如果不能让我的问题更清楚.)
谢谢.
plsql ×10
oracle ×6
sql ×3
exception ×2
casting ×1
constraints ×1
dbms-output ×1
function ×1
java ×1
oracle10g ×1
select ×1
sql-server ×1
sqlplus ×1
t-sql ×1