从本指南中,我能够将简单数据类型(如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) 我有一个带有字段 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) 我正在使用 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)
如何将附加文本连接到已经存在的字符串变量?
谢谢
我正在尝试在 SQL Developer 中编写 PL/SQL,但它没有显示输出。我的程序编译成功。这是代码:
set serveroutput on
declare
begin
dbms_output.put_line('Hi');
end;
Run Code Online (Sandbox Code Playgroud)
请建议我应该怎么做才能显示输出?我需要更改任何设置吗?
我在使用以下 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) 我有一个查询,输出是这样的:
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) 我有一个带有 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 个表。选择每个左连接以了解哪个表实际上导致错误是很耗时的。
下面是我的代码。
一个变量没有价值。另一个变量是有一个值。在下面的代码中,我想打印即使在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) 我很难理解这个错误:
第 3 行错误:PLS-00103:在预期以下情况之一时遇到符号“&”:
) , * & - + / 在 mod 余数 rem 和 or as || 多集
代码是:
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。谢谢。
到目前为止,我已经发现要描述一个表格,我可以使用以下内容:
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 文件)输出,它基本上描述了当前模式中的所有表。我该怎么办?
plsql ×10
oracle ×8
sql ×3
dynamic-sql ×2
compare ×1
cx-oracle ×1
insert ×1
loops ×1
null ×1
oracle-apex ×1
postgresql ×1
python ×1
sql-scripts ×1