标签: plsql

在SQL Developer中打印变量的值

我想打印一个匿名块内的特定变量的值.我正在使用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)

oracle plsql oracle-sqldeveloper

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

SQL错误"ORA-01722:无效的数字"

对某人来说非常容易,以下插页给了我

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)

sql oracle plsql casting type-conversion

91
推荐指数
7
解决办法
76万
查看次数

Oracle SQL Query用于列出数据库中的所有模式

我想在oracle DB上删除一些未使用的模式.

如何查询所有模式名称?

oracle plsql

90
推荐指数
6
解决办法
35万
查看次数

如何获取受存储过程影响的记录数?

对于INSERT,UPDATEDELETESQL直接对数据库执行的语句,大多数数据库提供商返回受影响的行数.对于存储过程,受影响的记录数始终为-1.

我们如何获得受存储过程影响的记录数?

sql t-sql sql-server oracle plsql

83
推荐指数
5
解决办法
14万
查看次数

DBMS_OUTPUT.PUT_LINE无法打印

执行以下代码时,它只是说过程已完成,并且不打印我想要的信息(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)

多次!

plsql sqlplus oracle10g dbms-output

81
推荐指数
6
解决办法
36万
查看次数

当我不知道约束的名称时,如何在Oracle中删除"not null"约束?

我有一个数据库,在字段上有一个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_CONDITIONLONG数据类型或如何最好地动态删除即使我知道它的名字查找到的约束.

那么,我如何创建一个更改脚本,可以根据它的内容而不是它的名称来删除这个约束?


编辑:@ Allan的回答很好,但我担心(由于我缺乏Oracle的专业知识),任何可能具有系统生成名称的约束都可能与其相关联,这可能并不普遍.约束而不必知道它的名字.在逻辑上删除该约束时,总会有一种方法可以避免必须知道系统命名约束的名称吗?

oracle plsql constraints

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

Oracle PL/SQL - 使用自定义SQLERRM提高用户定义的异常

是否可以创建用户定义的异常并能够更改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)

oracle plsql exception custom-exceptions

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

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

当结果可能为null时,如何在PL/SQL中选择变量?

有没有办法只运行一次查询以选择变量,考虑到查询可能什么都不返回,那么在这种情况下变量应该为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.

select plsql

65
推荐指数
5
解决办法
27万
查看次数

如何通过Exception getCause()循环查找具有详细消息的根本原因

我试图saveOrUpdate()在休眠中调用来保存数据.由于列具有唯一索引,因此ConstraintViolationException当我通过Eclipse调试器查看时它会抛出.

由于在将数据插入表时,根本原因可能因异常而异.
我想知道,如何循环/遍历getCause()以检查异常的根本原因及其消息.

更新:
感谢大家的回复,我希望输出如下图所示:
在此输入图像描述
我需要访问 detailMessage字段.
(我真的很抱歉,如果不能让我的问题更清楚.)

谢谢.

java plsql exception

63
推荐指数
5
解决办法
7万
查看次数