我目前正在尝试了解如何使用我在包中创建的类型作为我的表中的列类型.
这是我的包裹的代码......
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 - "无效的数据类型"*原因:
*操作:
任何人都可以协助吗?这将不胜感激.
我正在尝试将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) 在这里,我使用从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) 我修改了以下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) 我在匿名块中有很多代码,我担心PL/SQL优化器不会优化该代码.我应该将我的代码从匿名块移动到包中以确保优化器为我完成所有繁重的工作吗?
我必须更新有大约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)
你有什么想法为什么它减速这么多,怎么可能加快这个更新?
在世界上向上移动我开始迈出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会回来..
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中使用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中使用带有数组的过程.
我在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 ×10
plsql ×10
oracle12c ×2
arrays ×1
bulk-collect ×1
bulkupdate ×1
database ×1
optimization ×1
oracle-apex ×1
oracle11g ×1
parameters ×1
sql-update ×1
varray ×1