标签: plsql

cx_Oracle 如何将复合/复杂数组传递给 PLSQL 过程?

从本指南中,我能够将简单数据类型(如cx_Oracle.NUMBER)的关联数组传递给 PL/SQL 过程。

CREATE OR REPLACE PACKAGE test
IS
    TYPE t_ids IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
    PROCEDURE foo(p_ids_i IN t_ids);
END;
/
Run Code Online (Sandbox Code Playgroud)

调用它:

ids = cursor.arrayvar(cx_Oracle.NUMBER, [1,2,3])
cursor.callproc('test.foo', [ids])
Run Code Online (Sandbox Code Playgroud)

但是,我想调用以下过程,foo而不是采用复杂类型。

CREATE OR REPLACE PACKAGE test
IS
    TYPE r_foo IS RECORD (id NUMBER, name VARCHAR2(10));
    TYPE t_complex IS TABLE OF r_foo INDEX BY PLS_INTEGER;
    PROCEDURE foo(p_ids_i IN t_complex);
END;
/
Run Code Online (Sandbox Code Playgroud)

我尝试过各种事情,例如:

# Raises NotSupportedError: Variable_TypeByPythonType(): unhandled data type
foos = cursor.arrayvar((cx_Oracle.NUMBER, cx_Oracle.STRING), [(1, …
Run Code Online (Sandbox Code Playgroud)

python oracle plsql cx-oracle

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

检查字符串是否为有效日期

我有一个带有字段 sourcefilename 的表,它有 5 条记录。以下是记录。

SN. SOURCEFILENAME
1. 20170215095453_1.Iredell Memorial Hospital Dental Eligibility.xls_INFREPT01.txt
2. Iredell Memorial Hospital Eligibility April 2017.xls_INFREPT01.txt
3. Iredell Memorial Hospital Eligibility March 2017.xls_INFREPT01.txt
4. Iredell Memorial Hospital Eligibility May 2017.xls_INFREPT01.txt
5. Iredell Memorial Hospital October 2016 Dental Eligibility.xls_EligData.txt
Run Code Online (Sandbox Code Playgroud)

我只需要提取前 8 个字符并检查它是否是有效日期。如果它是一个有效日期,则返回 TRUE,否则返回 FALSE。

我试过 ISDATE 函数。还有其他选择吗?

SELECT DISTINCT SubStr(sourcefilename,1,8),
CASE WHEN isdate(SubStr(sourcefilename,1,8),'YYYYMMDD') = 1 THEN 'TRUE' ELSE 'FALSE' END  FROM ai_4451_1_metl;
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

将附加文本连接到 pl/pgsql 中的字符串变量

我正在使用 pl/pgsql 并且我正在尝试做类似的事情 myvar+="additional text"

这就是我所做的

mywhere := 'dyn_tab2.id=$1';
IF fk IS NOT NULL
THEN
mywhere := mywhere || "AND dyn_tab2.fk_id=$2";
END IF;
Run Code Online (Sandbox Code Playgroud)

所以,我希望决赛mywhere是dyn_tab2.id=$1 AND dyn_tab2.fk_id=$2,但我收到以下错误

ERROR:  column "AND dyn_tab2.fk_id=$2" does not exist
LINE 1: SELECT mywhere || "AND dyn_tab2.fk_id=$2"
                          ^
QUERY:  SELECT mywhere || "AND dyn_tab2.fk_id=$2"
CONTEXT:  PL/pgSQL function __aa(integer,integer) line 12 at assignment
SQL state: 42703
Run Code Online (Sandbox Code Playgroud)

如何将附加文本连接到已经存在的字符串变量?

谢谢

postgresql plsql concatenation dynamic-sql

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

SQL Developer 不显示 dbms_output

我正在尝试在 SQL Developer 中编写 PL/SQL,但它没有显示输出。我的程序编译成功。这是代码:

set serveroutput on

declare
begin
    dbms_output.put_line('Hi');
end;
Run Code Online (Sandbox Code Playgroud)

请建议我应该怎么做才能显示输出?我需要更改任何设置吗?

plsql oracle-sqldeveloper

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

如何在 Oracle 中使用 for 循环进行插入?

我在使用以下 for 循环在 Oracle 中插入 100 万条记录时遇到问题。insert 语句独立工作,但不在循环内。我在这里做错了什么?

BEGIN
    FOR v_LoopCounter IN 385000000..1000000 LOOP
        INSERT INTO PORT (snb, real_exch, act_exch, user_type, status_id, category_id, assignable) 
            VALUES (TO_CHAR(v_LoopCounter),'GSMB','GSMB','GSM',0,90,'0');
        COMMIT;
    END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

sql oracle plsql loops insert

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

在 oracle 12c 中将查询的输出转换为 json

我有一个查询,输出是这样的:

    1  2 3 4 5 6 7 8 9 10 11 12 13
    -  - - - - - - - - -   -  - -    
    40 20 22 10 0 0 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

我想将输出转换为一列,该列如下所示:

    output
    -----------
 {"1":40,"2":20,"3":22,"4":10,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0}
Run Code Online (Sandbox Code Playgroud)

oracle plsql oracle-sqldeveloper

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

我们能否找到导致 ORA-00942 表或视图不存在的表。:

我有一个带有 CTAS 查询的普通 PLSQL 块。

BEGIN
EXECUTE IMMEDIATE'
CREATE TABLE ZZZ_TEMP NOLOGGING PARALLEL AS
SELECT /*+ PARALLEL(a,4) */
        *
    FROM
        HI0XXX001.HI_TABLE_NAME a
    LEFT JOIN
        HR_001_GROUP B
    ON
        a.EMPLOYERGROUP_UD =B.ACC_NUM
    LEFT JOIN
        HR_002_GROUP l
    ON
        a.EMPLOYERGROUP_UD =l.EMPLOYERGROUP_UD
    AND
        a.GRP_CON_UD_COV_CONTRACT_NAME=l.GRP_CON_UD_COV_CONTRACT_NAME
    ';
EXCEPTION WHEN OTHERS THEN Dbms_Output.put_line(SQLERRM);
END;
Run Code Online (Sandbox Code Playgroud)

假设 HR_002_GROUP 表在我运行此块的模式中不存在。有什么方法可以显示错误消息,说 HR_002_GROUP 表不存在?

我发布的查询只是一个示例场景。我们在 ETL 结构中工作,我们有一大行查询脚本,可以将数百万个数据从许多 HI 表中的一个插入到另一个带有前缀 VH 的小表中。我在左连接中有大约 15-30 个表。选择每个左连接以了解哪个表实际上导致错误是很耗时的。

oracle error-handling plsql dynamic-sql

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

如何比较PLSQL中的空值

下面是我的代码。

一个变量没有价值。另一个变量是有一个值。在下面的代码中,我想打印即使在var1没有任何值的情况下变量也不相同。我怎样才能做到这一点?

CREATE OR REPLACE PACKAGE BODY mypackagebody IS

 PROCEDURE comparenull() IS
  l_var1 mytable.mycolumn1%TYPE;
  l_var2 mytable.mycolumn2%TYPE;

 BEGIN
  BEGIN
   SELECT var1
         ,var2
   INTO   l_var1
         ,l_var2
   FROM   mytable;
  EXCEPTION
   WHEN no_data_found THEN
    var1 := NULL;
    var2 := NULL;
  END;

  /* At this point var1 is NOT having any value and var2 is having a value.*/
  /* The below if condition is returing false. But, I wanted to go inside the if condition and print that the var values are not …
Run Code Online (Sandbox Code Playgroud)

oracle null plsql compare

2
推荐指数
2
解决办法
2191
查看次数

SQL 我不明白我的触发器有什么问题

我很难理解这个错误:

第 3 行错误:PLS-00103:在预期以下情况之一时遇到符号“&”:

) , * & - + / 在 mod 余数 rem 和 or as || 多集

  1. 创建或替换触发器 class_trigger
  2. 在为每一行插入课堂之前
  3. 开始
  4. IF (type = 'vl' && mass < 15000) THEN
  5. 质量:= 15000;

代码是:

CREATE OR REPLACE TRIGGER class_trigger
BEFORE INSERT ON Class FOR EACH ROW
BEGIN

  IF (type = 'vl' && mass < 15000) THEN
  mass := 15000;
  END IF;

END;
Run Code Online (Sandbox Code Playgroud)

我的代码有什么问题?我正在使用 Oracle 的 APEX。谢谢。

sql oracle plsql database-trigger oracle-apex

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

如何从现有模式在 Oracle 中编写表结构?

到目前为止,我已经发现要描述一个表格,我可以使用以下内容:

select dbms_metadata.get_ddl('TABLE','<my table name>','<table owner>') from dual;
Run Code Online (Sandbox Code Playgroud)

我还发现我可以使用以下语句从当前用户那里获取表列表:

select table_name from user_tables;
Run Code Online (Sandbox Code Playgroud)

但是,我需要找到一种将这两者结合起来的方法,以便我得到一个(最好是 SQL 文件)输出,它基本上描述了当前模式中的所有表。我该怎么办?

sql oracle plsql sql-scripts data-dictionary

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