我正在努力为同事做一些Oracle工作,并陷入困境.在尝试编写脚本以将列修改为可为空时,我遇到了可爱的ORA-01451错误:
ORA-01451: column to be modified to NULL cannot be modified to NULL
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为列已经是NULL.我们有几个需要更新的数据库,所以在我错误的假设中,我认为将其设置为NULL应该全面工作以确保每个人都是最新的,无论他们是否已将此列手动设置为可为空.但是,对于已经将列作为可空的一些人来说,这显然会导致错误.
如何检查列是否已经可以为空以避免错误?能够实现这个想法的东西:
IF( MyTable.MyColumn IS NOT NULLABLE)
ALTER TABLE MyTable MODIFY(MyColumn NULL);
Run Code Online (Sandbox Code Playgroud) 我正在尝试检查oracle(10g)查询中的列中的值是否为数字以便进行比较.就像是:
select case when ( is_number(myTable.id) and (myTable.id >0) )
then 'Is a number greater than 0'
else 'it is not a number'
end as valuetype
from table myTable
Run Code Online (Sandbox Code Playgroud)
关于如何检查的任何想法?
我试图获取模式中所有表的记录计数.我在编写PL/SQL时遇到问题.这是我到目前为止所做的,但我遇到了错误.请建议任何更改:
DECLARE
v_owner varchar2(40);
v_table_name varchar2(40);
cursor get_tables is
select distinct table_name,user
from user_tables
where lower(user) = 'SCHEMA_NAME';
begin
open get_tables;
fetch get_tables into v_table_name,v_owner;
INSERT INTO STATS_TABLE(TABLE_NAME,SCHEMA_NAME,RECORD_COUNT,CREATED)
SELECT v_table_name,v_owner,COUNT(*),TO_DATE(SYSDATE,'DD-MON-YY') FROM v_table_name;
CLOSE get_tables;
END;
Run Code Online (Sandbox Code Playgroud) 我有一个XMLTYPE,其中包含以下内容:
<?xml version="1.0"?>
<users>
<user>
<name>user1</name>
</user>
<user>
<name>user2</name>
</user>
<user>
<name>user3</name>
</user>
</users>
Run Code Online (Sandbox Code Playgroud)
如何通过所有元素"user"循环PL/SQL?谢谢
我第一次体验Oracle和TOAD(我知道SSMS).我在更新过程中的输入参数旁边遇到了这个"%Type",我不知道它是什么或它意味着什么.我在Google上找到了与"%Rowtype"相关的链接.是同一件事还是完全不同的事情?
如果这很模糊,我道歉.一如既往,感谢您的帮助.
如何从存储过程(OUT变量)返回的引用游标中获取并将结果行打印到SQL*PLUS中的STDOUT?
ORACLE存储过程:
PROCEDURE GetGrantListByPI(p_firstname IN VARCHAR2, p_lastname IN VARCHAR2,
p_orderby IN VARCHAR2, p_cursor OUT grantcur);
Run Code Online (Sandbox Code Playgroud)
PL/SQL:
SET SERVEROUTPUT ON;
DECLARE
TYPE r_cursor IS REF CURSOR;
refCursor r_cursor;
CURSOR grantCursor IS
SELECT last_name, first_name
FROM ten_year_pis
WHERE year_added = 2010;
last_name VARCHAR2(100);
first_name VARCHAR2(100);
BEGIN
OPEN grantCursor;
FETCH grantCursor INTO last_name, first_name;
WHILE grantCursor%FOUND LOOP
PMAWEB_PKG.GetGrantListByPI(last_name, first_name, 'last_name', refCursor);
--HOW DO I LOOP THROUGH THE RETURNED REF CURSOR (refCursor)
--AND PRINT THE RESULTING ROWS TO STDOUT?
FETCH grantCursor into last_name, first_name; …Run Code Online (Sandbox Code Playgroud) 让我们假设我有这样的样本数据:
| Name | ID | PARENT_ID |
-----------------------------
| a1 | 1 | null |
| b2 | 2 | null |
| c3 | 3 | null |
| a1.d4 | 4 | 1 |
| a1.e5 | 5 | 1 |
| a1.d4.f6 | 6 | 4 |
| a1.d4.g7 | 7 | 4 |
| a1.e5.h8 | 8 | 5 |
| a2.i9 | 9 | 2 |
| a2.i9.j10| 10 | 9 |
Run Code Online (Sandbox Code Playgroud)
我想从accountId = …
作为构建过程和不断发展的数据库的一部分,我正在尝试创建一个脚本,该脚本将删除用户的所有表和序列.我不想重新创建用户,因为这将需要比允许更多的权限.
我的脚本创建了一个删除表/序列的过程,执行过程,然后删除过程.我正在从sqlplus执行该文件:
drop.sql中:
create or replace procedure drop_all_cdi_tables
is
cur integer;
begin
cur:= dbms_sql.OPEN_CURSOR();
for t in (select table_name from user_tables) loop
execute immediate 'drop table ' ||t.table_name|| ' cascade constraints';
end loop;
dbms_sql.close_cursor(cur);
cur:= dbms_sql.OPEN_CURSOR();
for t in (select sequence_name from user_sequences) loop
execute immediate 'drop sequence ' ||t.sequence_name;
end loop;
dbms_sql.close_cursor(cur);
end;
/
execute drop_all_cdi_tables;
/
drop procedure drop_all_cdi_tables;
/
Run Code Online (Sandbox Code Playgroud)
不幸的是,丢弃该过程会导致问题.似乎导致竞争条件,并且程序在执行之前被删除.
例如:
SQL*Plus: Release 11.1.0.7.0 - Production on Tue Mar 30 18:45:42 2010 Copyright (c) 1982, 2008, Oracle. …
基本上我想运行以下查询:
INSERT INTO historical_car_stats (historical_car_stats_id, year, month, make, model, region, avg_msrp, count)
SELECT
my_seq.nextval,
'2010',
'12',
'ALL',
'ALL',
region,
sum(avg_msrp * count) / sum(count),
sum(count)
FROM historical_car_stats
WHERE year = '2010'
AND month = '12'
AND make != 'ALL'
GROUP BY region;
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为"此处不允许序列号"SQL错误.我怎么写这个,以便Oracle让我做我想做的事情?