标签: plsql

如何在表中使用打包类型作为列类型?

我目前正在尝试了解如何使用我在包中创建的类型作为我的表中的列类型.

这是我的包裹的代码......

create or replace PACKAGE  MY_TYPES
IS 
--Associative Array Types 
TYPE permutation_array IS TABLE OF VARCHAR2(300) INDEX BY PLS_INTEGER; 

--VARRAY Types
TYPE code_array IS VARRAY(4) OF VARCHAR2(9); 
Run Code Online (Sandbox Code Playgroud)

那我的桌子......

CREATE TABLE mastermind.match_table (match_id NUMBER(4), code_breaker_id NUMBER(4) , 
code_breaker_name VARCHAR2(200),
code_master_id NUMBER(4),
code_master_name VARCHAR2(200),
winner_id NUMBER(4),
game_code MY_TYPES.code_array );
Run Code Online (Sandbox Code Playgroud)

我收到了错误......

从命令行中的第3行开始出错 - CREATE TABLE mastermind.match_table(match_id NUMBER(4),code_breaker_id NUMBER(4),code_breaker_name VARCHAR2(200),code_master_id NUMBER(4),code_master_name VARCHAR2(200),winner_id NUMBER(4) ,game_code MASTERMIND_COLLECTION_TYPES.code_array)错误报告 - ORA-00902:无效的数据类型00902. 00000 - "无效的数据类型"*原因:
*操作:

任何人都可以协助吗?这将不胜感激.

database oracle plsql user-defined-types varray

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

创建Oracle PL / SQL存储过程

我正在尝试将SQL查询转换为Oracle PL / SQL存储过程。

这是查询:

select * from table1 where DATE = " + s1 + " and TYPE='" + ty + "' and  NAME='"+nm+"' Order by TYPE DEsc;
Run Code Online (Sandbox Code Playgroud)

这是存储过程:

CREATE PROCEDURE procedure1
    ( 
    s1 IN DATE,
    ty IN CHAR DEFAULT 2,
    nm IN VARCHAR2 DEFAULT 64
    )
IS 
    d table1.DATE%TYPE;
    C table1.TYPE%TYPE;
    S table1.NAME%TYPE;
    CURSOR tb IS select DATE,TYPE,NAME INTO d,c,s from table1;
BEGIN
    FOR i IN tb
    LOOP 
        DBMS_OUTPUT.PUT_LINE('DATE' ||i.DATE);
        DBMS_OUTPUT.PUT_LINE('TYPE' ||i.TYPE);
        DBMS_OUTPUT.PUT_LINE('NAME' ||i.NAME);
    END LOOP;

END procedure1; …
Run Code Online (Sandbox Code Playgroud)

oracle plsql stored-procedures oracle12c

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

在Oracle/PLSQL中增加Datetime时出错

在这里,我使用从StartDateTime到EndDatetime的循环,并在每次迭代中添加1小时.一切都在Loop.But问题是在插入查询.请检查插入查询.

declare
StartDateTime   TIMESTAMP :=to_date( '2017-01-01 00:00:00','yyyy-mm-dd       
hh24:mi:ss');
EndDateTime   TIMESTAMP :=to_date( '2017-12-31 00:00:00','yyyy-mm-dd 
hh24:mi:ss');
dateti TIMESTAMP;
dateti2 TIMESTAMP;
StartDateTime1 TIMESTAMP;
sub INTEGER;
semester Number;
begin

sub:=( CAST( EndDateTime AS DATE ) - CAST( StartDateTime AS DATE ) )  ;

FOR i IN  0 .. 1
LOOP
StartDateTime1:=StartDateTime+i;
for idx in 0..2 loop
dateti:=to_date(StartDateTime1+(idx/24.0),'yyyy-mm-dd hh24:mi:ss');
dateti2:=to_date(StartDateTime1+((idx+1)/24.0)+ interval '-1' second,'yyyy-
mm-dd hh24:mi:ss');

      case 
        when to_number(to_char(dateti ,'Q'))>6 then semester:=to_number(2);
       else semester:=to_number(1);
        end case;
Run Code Online (Sandbox Code Playgroud)

问题从插入查询开始.它说非数字字符找到.DateSlotStart和DateSlotEnd数据类型是Timestramp.请看图像并告知我应该更改什么?

在此输入图像描述

  insert into DimDate1(DateSlotStart,DateSlotEnd,
  "Date",SlotName,MonthName,MonthNumberOfYear,Quarter,Year,Semester) values 
   (to_date(dateti ,'yyyy-mm-dd hh24:mi:ss') ,to_date(dateti2 …
Run Code Online (Sandbox Code Playgroud)

oracle plsql oracle11g oracle12c

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

BULK COLLECT的奇怪行为

我修改了以下PL/SQL BULK-COLLECT,它可以快速地在巨大的表(> 50.000.000)上进行更新.唯一的问题是,它不会执行每个表的剩余<5000行的更新.5000是FETCH指令的给定限制:

DECLARE
-- source table cursor (only columns to be updated)
  CURSOR base_table_cur IS
  select a.rowid, TARGET_COLUMN from TARGET_TABLE a
                        where TARGET_COLUMN is null;

    TYPE base_type IS
        TABLE OF base_table_cur%rowtype INDEX BY PLS_INTEGER;
    base_tab  base_type;    

-- new data
    CURSOR new_data_cur IS
      select a.rowid,
        coalesce(b.SOURCE_COLUMN, 'FILL_VALUE'||a.JOIN_COLUMN) TARGET_COLUMN from TARGET_TABLE a 
        left outer join SOURCE_TABLE b
        on a.JOIN_COLUMN=b.JOIN_COLUMN
        where a.TARGET_COLUMN is null;

    TYPE new_data_type IS TABLE OF new_data_cur%rowtype INDEX BY PLS_INTEGER;
    new_data_tab       new_data_type;
    TYPE row_id_type IS TABLE OF ROWID INDEX …
Run Code Online (Sandbox Code Playgroud)

oracle plsql bulk-collect bulkupdate

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

Oracle PL/SQL优化器是优化匿名块还是仅存储程序单元?

我在匿名块中有很多代码,我担心PL/SQL优化器不会优化该代码.我应该将我的代码从匿名块移动到包中以确保优化器为我完成所有繁重的工作吗?

oracle plsql

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

加快Oracle DB上的更新记录了很多

我必须更新有大约93万条记录的表,在开始DB每5秒更新10 k记录,现在大约60万条更新记录后,更新下一条10k记录需要30-60秒,不知道为什么我要更新null的列.
我使用循环提交每10 k记录:

  LOOP
    UPDATE TABLE
    SET DATE_COLUMN = v_hist_date
    WHERE DATE_COLUMN IS NULL
          AND ROWNUM <= c_commit_limit
          AND NOT_REMOVED IS NULL;

    EXIT WHEN SQL%ROWCOUNT = 0;
    COMMIT;
  END LOOP;
Run Code Online (Sandbox Code Playgroud)

你有什么想法为什么它减速这么多,怎么可能加快这个更新?

oracle optimization plsql query-optimization sql-update

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

用于从两个表中检索数据的Oracle PL/SQL匿名块(NOVA环境)

在世界上向上移动我开始迈出PL/SQL的第一步,我必须承认我完全迷失了.不幸的是,我读过的很多参考文献都没有帮助解决这个问题.

鉴于此,我想我会创建几个基本的表格来到这里寻求始终流动的伟大建议.我似乎通过查看示例和"分解"它们在我的大脑中有意义来学习更好.

那么,就此而言 - 有人可以告诉我如何开发一个匿名PL/SQL块来输出下表中的一些基本数据吗?假设输出应显示客户购买夏普电视的总销售数量.

这是我创建的一些表:

CREATE TABLE TVMAKES
        (tvID     INT             PRIMARY KEY,
        tvMake    VARCHAR(20)     NOT NULL,
        tvModel   VARCHAR(20)     NOT NULL);

CREATE TABLE TVSALES
        (saleID      INT          PRIMARY KEY,
        tvID         INT,
CONSTRAINT SALES_FK1 FOREIGN KEY (tvID) REFERENCES TVMAKES(tvID));
Run Code Online (Sandbox Code Playgroud)

以下是填充表格的一些数据:

INSERT INTO TVMAKES (tvID,tvMake,tvModel) VALUES (1,'Sharp','50LCD');
INSERT INTO TVMAKES (tvID,tvMake,tvModel) VALUES (2,'Sony','20LCD');
INSERT INTO TVMAKES (tvID,tvMake,tvModel) VALUES (3,'Samsung','25LCD');
INSERT INTO TVMAKES (tvID,tvMake,tvModel) VALUES (4,'LG','58LCD');
INSERT INTO TVMAKES (tvID,tvMake,tvModel) VALUES (5,'Vizio','60LCD');
INSERT INTO TVMAKES (tvID,tvMake,tvModel) VALUES (6,'Sharp','30LCD');

INSERT INTO TVSALES (saleID,tvID) VALUES (1,1); …
Run Code Online (Sandbox Code Playgroud)

oracle plsql

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

ORA-06550:参数的数量或类型错误

为什么oracle会回来..

ORA-06550:第9行,第3列:PLS-00306:调用'ADD_RULE_RANGE_ATTR'ORA-06550时参数的数量或类型错误:第9行,第3列:PL/SQL:语句被忽略

当我根据程序规范设置所有类型和参数时.

程序规范

PROCEDURE add_rule_range_attr(
    "p_name" IN VARCHAR2,
    "p_entity" IN VARCHAR2,
    "p_attribute" IN VARCHAR2,
    "p_r_negate" IN NUMBER,
    "p_ra_comparer1" IN VARCHAR2,
    "p_ra_comparer2" IN VARCHAR2
);
Run Code Online (Sandbox Code Playgroud)

最初我的代码在Oracle APEX环境中运行,其中过程的参数由输入变量填充(例如:PX_INPUT_NAME),因此我必须确保我在参数中放入的所有变量都是正确的数据类型.但是,在调用过程时,我使用的变量具有与过程参数所请求的数据类型相对应的默认值.

调用程序

brg_manager.add_rule_range_attr(
    p_name => v_name,
    p_entity => v_entity,
    p_attribute => v_attribute,
    p_r_negate => v_negate,
    p_ra_comparer1 => v_comparer1,
    p_ra_comparer2 => v_comparer2
);
Run Code Online (Sandbox Code Playgroud)

看看这个sqlfiddle的工作示例.

oracle plsql stored-procedures oracle-apex

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

我如何使用数组查询

我在Oracle中使用array参数创建了一个过程:

create or replace PACKAGE my_pkg AS

TYPE USER_ID_TYPE IS TABLE OF VARCHAR2(50) INDEX BY BINARY_INTEGER;

create or replace procedure my_proc (my_id varchar2, ids USER_ID_TYPE)
is
  xxxx xxxx xxxx ....
end;
Run Code Online (Sandbox Code Playgroud)

我想在sqldeveloper中测试一下.

我怎样才能做到这一点?

我试过这样的:

exec('1010', ('111', '222')) -> fail 

exec('1010', ['111', '222']) -> fail

exec('1010' ARRAY('111', '222')) -> fail
Run Code Online (Sandbox Code Playgroud)

我只想在sqldeveloper中使用带有数组的过程.

arrays oracle parameters plsql

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

获取PL/SQL中的本地过程列表

我在DECLARE..BEGIN..END;块中定义了几个本地函数/过程:

DECLARE
  PROCEDURE a IS
  BEGIN
    ...
  END;
  PROCEDURE b IS
  BEGIN
    ...
  END;
BEGIN

END;
Run Code Online (Sandbox Code Playgroud)

如何获得所有已定义函数/过程的列表?(在这个例子中:['a','b'])

oracle plsql

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