是否可以在pl/sql的IN CLAUSE中使用VARRAY?
我正在尝试为varray编写一些聚合函数,当我尝试将它与数据库中的数据一起使用时,我得到了这个错误代码:
ORA-00600 internal error code, arguments: [kodpunp1], [], [], [], [], [], [], [], [], [], [], []
[koxsihread1], [0], [3989], [45778], [], [], [], [], [], [], [], []
Run Code Online (Sandbox Code Playgroud)
函数的代码非常简单(事实上它什么都不做):
create or replace
TYPE "TEST_VECTOR" as varray(10) of varchar(20)
ALTER TYPE "TEST_VECTOR" MODIFY LIMIT 4000 CASCADE
create or replace
type Test as object(
lastVector TEST_VECTOR,
STATIC FUNCTION ODCIAggregateInitialize(sctx in out Test) return number,
MEMBER FUNCTION ODCIAggregateIterate(self in out Test, value in TEST_VECTOR) return number,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT …Run Code Online (Sandbox Code Playgroud) 我的表中有一个包含VARRAY VARCHAR2的列,所以我想创建一个select语句,它给我所有的列和VARRAY的所有对象,彼此相邻,是否有可能这样做?
例:
CREATE TYPE arr AS VARRAY(5) OF VARCHAR2(10);
CREATE TABLE table1(
v1 VARCHAR2(10)
v2 VARCHAR2(20)
v3 arr);
SELECT t.v1, t.v2, ??? FROM table1 t;
Run Code Online (Sandbox Code Playgroud)
谢谢!
我有一个PL/SQL VArray,我正在填写像这样的BULK COLLECT查询:
SELECT id
BULK COLLECT INTO myarray
FROM aTable
Run Code Online (Sandbox Code Playgroud)
现在我想把这个集合的一部分传递给另一个集合,如下所示:
newarray := myarray(2..5)
Run Code Online (Sandbox Code Playgroud)
这应该将元素2,3,4和5从myarray传递给newarray.
我可以写一个循环并复制元素,但是有更简洁的方法吗?
我正在尝试编写一个小程序,它必须存储和检索数据库中的值.数据库是对象关系的.
这是DDL语句:
create or replace type Guy as object (name varchar(80), address varchar(80), dateOfBirth date)
create or replace type KnownLanguages as varray(10) of varchar(80)
create table Coders (person_ Guy, description clob, knownLanguages_ KnownLanguages)
Run Code Online (Sandbox Code Playgroud)
这是我的Java代码:
package adbms;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import oracle.jdbc.OracleDriver;
import oracle.jdbc.driver.OraclePreparedStatement;
import oracle.jdbc.driver.OracleResultSet;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
public class SimpleJdbcApplication {
public static final String DRIVER_TYPE = "thin";
public static final …Run Code Online (Sandbox Code Playgroud) Oracle 支持使用 VARRAYS 和 NESTED TABLE 数据类型,允许多值属性。(http://www.orafaq.com/wiki/NESTED_TABLE)
我目前使用 Hibernate 3 作为我的 ORM 框架,但我不知道如何将 Hibernate 映射到数据库中的 NESTED TABLE/VARRAY 数据类型。
我考虑在 Hibernate 中定义自定义类型,但没有成功。(Hibernate 甚至可以处理取消嵌套子表所需的“COLUMN_VALUE”Oracle 关键字吗?)
有谁知道如何在 Hibernate 中实现这些数据类型?
感谢大家的帮助。
——TBW。
我的.NET代码目前正在使用ODP.NET多次调用存储过程来操作许多表中的各个行..NET代码有一组要更改的行.每次调用只改变一个参数,我想将数组从.NET传递给PL/SQL以在多行上运行(行数将改变).
我使用以下方法成功地将数组从.NET传递到PL/SQL:
type number_arr is table of number(10) index by pls_integer;
PROCEDURE "BLAH" (foo IN number_arr);
Run Code Online (Sandbox Code Playgroud)
请注意,我认为number_arr被称为VARRAY,但我对此并不乐观,如果有人想要纠正我,请做(作为评论),但这可能会导致我的困惑.
但是现在,在PL/SQL中,我有许多更新语句,它们看起来像:
UPDATE t SET a = b WHERE a = foo;
Run Code Online (Sandbox Code Playgroud)
当foo不是一个数组时.我现在想写:
UPDATE t SET a = b WHERE a IN (foo);
Run Code Online (Sandbox Code Playgroud)
但是这种语法似乎不起作用.我一直无法找到一个结合使用VARRAY和'IN'(或'ANY'等)的Oracle的例子.我已经看到了如何使用SQL Server做到这一点的一些答案,但我不确定如何将其转换为Oracle.
当然,如果还有其他方法可以将数组从.NET运行到存储过程来执行此操作,那么这也将回答我的问题.我希望通过IN获得效率,所以在PL/SQL中对数组进行迭代(分别调用UPDATE语句)可能无济于事.
我知道两者的基本区别和用途。但是,我正在寻找的答案是,为什么要引入 VARRAY ?
因为,我们可以使用 NESTED TABLE 做同样的事情,而使用 VARRAY 可以做同样的事情,而在某些情况下反之亦然。另外,我注意到有些地方人们提到 VARRAY 存储元素in-line。这是什么意思 ?谁能解释两者的内部存储和处理?
我有这样一张桌子:
CREATE TABLE spatial_data (
id NUMBER PRIMARY KEY,
geometry SDO_GEOMETRY);
Run Code Online (Sandbox Code Playgroud)
SDO_GEOMETRY有一个带有以下类型的字段sdo_ordinates:
TYPE SDO_ORDINATE_ARRAY作为NUMBER的VARRAY(1048576)
我可以得到指定对象的点数:
select count(*)
from table(
select s.geometry.sdo_ordinates
from spatial_data s
where s.id = 12345
);
Run Code Online (Sandbox Code Playgroud)
我如何计算几个物体?这是不可能的
where s.id in (1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)
我真的很在乎性能.也许PL/SQL会是正确的选择?
我有这样的类型声明:
FUNCTION ...
IS
TYPE stati_va IS VARRAY (10000) OF varchar(1);
stati stati_va;
v_counter INTEGER := 0;
BEGIN
stati := stati_va ();
--this is actually in a loop so the array contains more values
v_counter := v_counter + 1;
stati.EXTEND;
stati (v_counter) := '4';
--here I would like to determine if the array 'stati' contains a value
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经尝试了以下但是这给了我一个错误
IF '4' member of stati then <- COMPILE error
IF '4' IN stati then <- COMPILE error
Run Code Online (Sandbox Code Playgroud)
我知道循环数组是可能的,但这有点不方便,因为我需要构建这样的东西:
IF array contains '4' …Run Code Online (Sandbox Code Playgroud)