ora_full_backup.sh

#!/bin/bash

BACKUP_DIR="/home/yshuai/works/2008-12-10_NPS61_ED2/backup_recovery/02_cluster/backup_scripts/gen2"

. /home/oracle/.bash_profile

 

# test if db on this node

sqlplus -L testuser/testuser | grep ORA-01017 > /dev/null

if [ $? -ne 0 ]; then

  now=`date '+%Y-%m-%d %H:%M:%S'`

  echo "Error: Oracle not start, can not perform full backup! ($now)" |tee -a $BACKUP_DIR/rmanErr.log

  exit

fi

 

# rotate logs

for i in 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

do

next=`expr $i + 1`

test -f $BACKUP_DIR/rman.log.$i && mv $BACKUP_DIR/rman.log.$i $BACKUP_DIR/rman.log.$next

done

 

#rman script

$ORACLE_HOME/bin/rman target / <<EOF > $BACKUP_DIR/rman.log.0

configure retention policy to recovery window of 15 days;

CONFIGURE CONTROLFILE AUTOBACKUP ON;

CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '$BACKUP_DIR/%F';

CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO COMPRESSED BACKUPSET;

CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT   '$BACKUP_DIR/%U';

crosscheck archivelog all;

backup database plus archivelog;

delete noprompt archivelog all backed up 2 times to device type disk;

crosscheck backup;

delete noprompt obsolete;

exit;

EOF

<think>好的,现在我要处理用户遇到的ORA-00918错误。用户提供了一个SQL查询,其中使用了WITH子句创建的临时表ptro,然后在主查询中进行了左连接,但运行时报错。我需要先理解错误的原因,然后找出解决方法。 首先,ORA-00918通常是因为列名在查询中被多次定义,导致数据库无法确定具体引用的是哪个列。用户提到临时表ptro可以单独运行成功,所以问题可能出在连接后的查询中。接下来需要分析用户的SQL语句。 用户的查询是: SELECT DISTINCT ptro.* FROM ptro LEFT JOIN WAT_WAFER_SUMMARY wws ON ptro.PRODUCT_NO = WWS.PRODUCT_ID AND ptro.LOT_ID = WWS.LOT_ID AND ptro.WAFER_ID = WWS.WAFER_ID AND ptro.WAT_PARAMETER_ID = WWS.WAT_PARAMETER_ID; 这里,ptro是临时表,使用ptro.*选择所有列,然后左连接到WAT_WAFER_SUMMARY表。问题可能出在两个表中存在相同名称的列,导致在SELECT时出现歧义。 比如,如果WAT_WAFER_SUMMARY表中也有PRODUCT_ID、LOT_ID等列,当使用ptro.*时,虽然明确来自ptro,但如果在ON子句中引用了其他表的列,可能会导致数据库混淆。不过,根据ON子句的连接条件,用户已经明确使用了ptro和wws的别名,所以可能不是这里的问题。 另一种可能是,临时表ptro中的某些列在创建时没有明确的别名,导致与其他表的列名冲突。例如,如果ptro中的某个列名与WAT_WAFER_SUMMARY中的列名相同,当使用ptro.*时,数据库无法确定这些列是否唯一,从而报错。 解决方案应该是避免使用.*,而是明确列出需要的列,并为可能存在冲突的列指定别名。此外,检查临时表ptro的结构,确保所有列名都是唯一的,并且没有与其他表重复的列名。 用户可能需要检查WAT_WAFER_SUMMARY表的结构,确认是否有与ptro中的列同名的列。例如,如果ptro和wws都有相同的列名,如PRODUCT_NO和PRODUCT_ID可能不是问题,但如果存在其他同名列,比如LOT_ID在两个表中都存在,那么使用ptro.*会导致选择时的歧义。 此外,用户可能在临时表ptro的定义中存在列名重复,例如在UNION操作中未正确指定别名,导致列名重复。需要检查ptro的CTE定义,确保所有列名都是唯一的,并且类型匹配。 总结可能的问题点: 1. ptro.*中的列与wws表中的列存在同名,导致歧义。 2. ptro临时表在定义时存在列名重复或未正确别名。 3. 在JOIN后的SELECT中使用了通配符,导致数据库无法确定列来源。 因此,建议用户修改查询,显式列出所需的列,并为可能冲突的列添加别名,同时检查临时表ptro的定义,确保列名唯一。</think>以下是针对您提供的SQL语句的详细分析和解决方案: --- ### **错误诊断** 当使用`ptro.*`结合`LEFT JOIN`时,若两个表存在**同名列**,即使连接条件正确,Oracle仍会因以下原因报错: ```sql ORA-00918: 未明确定义列 ``` 核心问题:`SELECT ptro.*`中的某些列名在`WAT_WAFER_SUMMARY`表中也存在,导致数据库无法区分列的来源。 --- ### **分步解决方案** #### **步骤1:验证临时表结构** 首先检查`WITH ptro AS (...) `中的CTE定义,确保: 1. 没有重复列名 2. 所有列名显式定义别名(避免使用`SELECT *`) **错误示例**: ```sql WITH ptro AS ( SELECT t1.id, t2.id -- 两个id列未重命名 FROM table1 t1 JOIN table2 t2 ON ... ) ``` **修正方案**: ```sql WITH ptro AS ( SELECT t1.id AS t1_id, -- 显式别名 t2.id AS t2_id FROM table1 t1 JOIN table2 t2 ON ... ) ``` #### **步骤2:显式指定输出列** 避免使用`SELECT *`,改为显式列出所需列并添加表别名: **原始错误代码**: ```sql SELECT DISTINCT ptro.* -- 高风险写法 FROM ptro LEFT JOIN WAT_WAFER_SUMMARY wws ON ...; ``` **修正方案**: ```sql SELECT DISTINCT ptro.PRODUCT_NO, ptro.LOT_ID, ptro.WAFER_ID, ptro.WAT_PARAMETER_ID -- 显式列出所需字段 FROM ptro LEFT JOIN WAT_WAFER_SUMMARY wws ON ptro.PRODUCT_NO = wws.PRODUCT_ID AND ptro.LOT_ID = wws.LOT_ID AND ptro.WAFER_ID = wws.WAFER_ID AND ptro.WAT_PARAMETER_ID = wws.WAT_PARAMETER_ID; ``` #### **步骤3:检查连接表列名冲突** 若`WAT_WAFER_SUMMARY`表中存在与`ptro`相同的列名(如`PRODUCT_NO`),需用表别名限定: **错误场景**: ```sql -- 假设WAT_WAFER_SUMMARY也有PRODUCT_NO列 SELECT ptro.PRODUCT_NO -- 未明确来源 FROM ptro LEFT JOIN WAT_WAFER_SUMMARY wws ON ...; ``` **修正方案**: ```sql SELECT ptro.PRODUCT_NO AS ptro_product_no, -- 显式别名 wws.PRODUCT_ID FROM ptro LEFT JOIN WAT_WAFER_SUMMARY wws ON ...; ``` --- ### **完整修正示例** 假设`ptro`临时表包含以下字段: - PRODUCT_NO - LOT_ID - WAFER_ID - WAT_PARAMETER_ID 修正后的SQL: ```sql WITH ptro AS ( -- 确保CTE内所有列名唯一 SELECT product_no, lot_id, wafer_id, wat_parameter_id FROM your_source_table WHERE ... ) SELECT DISTINCT ptro.PRODUCT_NO, ptro.LOT_ID, ptro.WAFER_ID, ptro.WAT_PARAMETER_ID, wws.OTHER_COLUMN -- 如需WAT_WAFER_SUMMARY的列 FROM ptro LEFT JOIN WAT_WAFER_SUMMARY wws ON ptro.PRODUCT_NO = wws.PRODUCT_ID AND ptro.LOT_ID = wws.LOT_ID AND ptro.WAFER_ID = wws.WAFER_ID AND ptro.WAT_PARAMETER_ID = wws.WAT_PARAMETER_ID; ``` --- ### **附加调试建议** 1. **单独验证CTE**: ```sql -- 单独运行CTE部分确认无报错 WITH ptro AS (...) SELECT * FROM ptro; ``` 2. **使用DESCRIBE检查表结构**: ```sql DESCRIBE WAT_WAFER_SUMMARY; -- 确认是否有与ptro重复的列名 ``` 3. **逐步添加JOIN条件**: ```sql -- 先不带JOIN测试 SELECT DISTINCT ptro.* FROM ptro; -- 逐步添加JOIN条件排查 LEFT JOIN WAT_WAFER_SUMMARY wws ON ptro.PRODUCT_NO = wws.PRODUCT_ID; ``` 通过上述方法,可精准定位到引发`ORA-00918`的具体列名。如果问题仍未解决,建议提供`ptro`临时表的完整定义和`WAT_WAFER_SUMMARY`表结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值