标签: plsql

pl/sql 中带有嵌套函数的过程中的异常处理

我有一个 pl/sql 过程,如下所述

CREATE OR REPLACE PROCEDURE add_affectedCircle
(v_affected_circle IN v_circle.circle_code%type)
IS
    v_circle_id  NUMBER;

BEGIN
        v_circle_id := get_circleID(v_affected_circle);
        INSERT INTO vf_affected_circle (affected_circle) 
        values (v_circle_id);

EXCEPTION
WHEN OTHERS THEN
RAISE_APPLICATION_ERROR (-20101, 'Problem in loading Affected Circle data');
END;
/
Run Code Online (Sandbox Code Playgroud)

首先,我使用函数 get_circleID 检查 vf_circle 表中的circle_code 列中可用的特定数据 v_affected_circle 并返回与circle_code 关联的circle_id。

CREATE OR REPLACE FUNCTION get_circleID 
( v_circle_code  vf_circle.circle_code%TYPE)
RETURN vf_circle.circle_id%TYPE
IS
    return_value  vf_circle.circle_id%TYPE; 
BEGIN
    BEGIN
        SELECT circle_id INTO return_value
        FROM vf_circle
        WHERE circle_code = v_circle_code;
   END;
   RETURN return_value;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RAISE_APPLICATION_ERROR(-20102, …
Run Code Online (Sandbox Code Playgroud)

oracle plsql stored-procedures

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

PLS-00103:在预期以下情况之一时遇到符号“(”:

我正在尝试从报告页面到表单页面检索客户 id pk 列,每当用户使用 oracle applicationexpress 从报告页面移动到表单页面时,该列就会自动递增。所以我正在尝试创建一个返回 a 的触发器具有最后一行的值以及 +1 增量的数字。但是我收到这个错误

Error at line 8: PLS-00103: Encountered the symbol "(" when expecting one of the following:
   , from
6. INTO number
7. FROM (SELECT a.cust_id, max(cust_id) over() as max_pk FROM customer a)
8. WHERE cust_id = max_pk;
9. number:=(cust_id+1);
10. END;
Run Code Online (Sandbox Code Playgroud)

这是我的 PL/SQL 过程。

CREATE OR REPLACE FUNCTION cust_id_incremental(cust_id IN number)
RETURN number;


BEGIN

SELECT cust_id
INTO number
FROM (SELECT a.cust_id, max(cust_id) over() as max_pk FROM customer a)
WHERE cust_id …
Run Code Online (Sandbox Code Playgroud)

oracle plsql plsqldeveloper

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

oracle存储过程将csv文件导入目标表

我有一个存储过程,可以使用 UTL 函数将 CSV 数据插入到 oracle 表中。我遇到困难的部分是当我在regexp_substr插入目标表之前必须使用时。我浏览了regexp_substr各种网站,但仍然不太掌握如何将其应用到这个特定导入程序的概念。

例如,假设我们有以下几行代码:

             V_EMPNO := REGEXP_SUBSTR(V_LINE, '[^,]+', 1, 1);
             V_ENAME := REGEXP_SUBSTR(V_LINE, '[^,]+', 1, 2);
Run Code Online (Sandbox Code Playgroud)

我的直率问题是,有人可以向我解释一下这条线的逻辑是如何工作的吗?我有一个 CSV 文件和包含 75 个字段的目标表,所以这当然只是一个样本,我知道我已经把这一部分写得很长了。我假设字符串的最后一部分只是行号,所以我不断增加它。

我的另一个问题是,我是否应该继续将所有记录定义为变量,并对regexp_substr属于导入一部分的所有字段单独执行操作?

csv oracle import plsql stored-procedures

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

动态调用存储过程(立即执行)输出参数问题

我有问题动态调用存储过程

\n\n
    v_sql      := 'begin '|| p_procname ||  '(''test1'','' test2 '',:v_output2);  end;';\n    execute immediate v_sql\n    using  out v_output2 ;\n    dbms_output.put_line(v_output2 || ' ' );\n
Run Code Online (Sandbox Code Playgroud)\n\n

在这里 \xc4\xb1 可以调用立即执行的过程。\n但我的问题是动态绑定变量。该值来自日志表,然后我解析execute_immediate 过程

\n\n
    v_sql      := 'begin '|| p_procname ||  '(''test1'','' test2'',:v_output2);  end;';\n    v_sql1:= ||using||  'out v_output2 ' ;\n\n    execute immediate v_sql\n    v_sql1;\n
Run Code Online (Sandbox Code Playgroud)\n\n

它不是那样工作的。我如何使动态变量绑定,因为我调用了很多过程,并且该过程具有不同的输入和输出参数。\n我希望你能理解我遇到的问题。我该如何解决这个问题,谢谢

\n

oracle plsql stored-procedures execute execute-immediate

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

使用pl/sql从文本文件读取文件

我想读取文本文件,将其存储在变量中并在 pl/sql 中输出该变量。我正在使用以下代码,但出现错误:语句被忽略。

create or replace PROCEDURE blah
AS
DECLARE
f UTL_FILE.FILE_TYPE;
s VARCHAR2(200);
BEGIN
f := UTL_FILE.FOPEN('C:\Users\s420105\Music','blahh.txt','R');
UTL_FILE.GET_LINE(f,s);
UTL_FILE.FCLOSE(f);
dbms_output.put_line(s);
END;
Run Code Online (Sandbox Code Playgroud)

我不确定 UTL 权限,但我想如果是由于 UTL 权限,它会抛出不同的错误。这

oracle plsql oracle11g plsqldeveloper

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

Pls-00364: 循环索引变量 'j' 使用无效

我正在尝试计算架构中每个表的数量。

SET serveroutput ON;
BEGIN
FOR I IN (SELECT TABLE_NAME FROM USER_TABLES) LOOP
FOR J IN (SELECT COUNT(1) CNT FROM I.TABLE_NAME) LOOP
DBMS_OUTPUT.PUT_LINE(I.TABLE_NAME||'>>'||J.CNT);
END LOOP;
END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)

但我遇到这样的错误。

Error report:
ORA-06550: line 3, COLUMN 37:
PL/SQL: ORA-00942: TABLE OR VIEW does NOT exist
ORA-06550: line 3, COLUMN 10:
PL/SQL: SQL Statement ignored
ORA-06550: line 4, COLUMN 42:
PLS-00364: loop INDEX variable 'J' USE IS invalid
ORA-06550: line 4, COLUMN 1:
PL/SQL: Statement ignored
Run Code Online (Sandbox Code Playgroud)

sql查询本身可以实现吗?/

sql oracle plsql

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

从 pl sql 中的行类型变量中选择动态列值

我需要从行类型变量获取特定的列值。我的示例代码是

declare
  col_name varchar2(100);
  col_val varchar2(100);
  TYPE column_table_type IS TABLE OF COLUMN_TABLE%ROWTYPE;
  column_table column_table_type ;

begin
 SELECT * BULK COLLECT INTO column_table FROM COLUMN_TABLE;
 for data_table in (select * from DATA_TABLE)
 loop
   for i in column_table.first .. column_table.count
   loop
     col_name=column_table(i).COLUMN_NAME; 
     /*
        How to get the col_val for col_name from the data_table with out extra query.
     */
   end loop;
 end loop
end;
/
Run Code Online (Sandbox Code Playgroud)

列_表:

COLUMN_NAME
----------------  
emp_name 
emp_id
emp_addr
Run Code Online (Sandbox Code Playgroud)

数据表:

emp_name   emp_id   emp_addr
----------------------------
  A          1        aaaa
  B          2        bbbb
  C …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

在 PL/SQL Developer 中测试函数

这是我的功能:

FUNCTION GET(V_IN IN NUMBER) RETURN VARCHAR2 AS
    V_OUT VARCHAR2(1000);
BEGIN
    function body
END;
Run Code Online (Sandbox Code Playgroud)

当我右键单击该函数并单击测试时,我得到以下信息:

begin
  -- Call the function
  :result := pkg.get(V_IN => :V_IN);
end;
Run Code Online (Sandbox Code Playgroud)

如何替换该变量 V_IN 的值?我需要测试一个数字,比如 940。

当我尝试代码时:

declare
  r varchar2(2000);
begin
  -- Call the function
  r := pkg.get(940);
end;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ORA-01036: illegal variable name/number
Run Code Online (Sandbox Code Playgroud)

您能建议调用此函数的各种方法吗?

PS:使用的工具:PL/SQL Developer Allround Automations。版本8.0.1.1502

Oracle 数据库 11g 企业版

oracle plsql plsqldeveloper

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

如何在 Oracle 中将 CLOB 转换为 UTF8 BLOB

我需要在 Oracle 中将数据从 CLOB 转换为 UTF8 编码的 BLOB。我该怎么做?

oracle plsql

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

显示 EXECUTE IMMEDIATE 语句的输出

我有一个存储过程来截断表,该表的名称作为参数传递给该过程。

create or replace procedure delete_data_from_table(table_id VARCHAR2)
is
    cursor table_cur is
        SELECT table_name FROM all_tables WHERE table_name LIKE '%' || table_id || '%';
    tab_name VARCHAR2(25);
BEGIN
    open  table_cur;
    LOOP
        FETCH table_cur into tab_name;
        exit when table_cur%notfound;
        EXECUTE IMMEDIATE 'TRUNCATE TABLE ' || tab_name;
    END LOOP;
    close table_cur;
END;
Run Code Online (Sandbox Code Playgroud)

execute immediate我想使用显示语句的输出DBMS_OUTPUT.PUT_LINE。可以这样做吗?

提前致谢。

sql oracle plsql

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