Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PL/SQL过程未返回预期结果_Oracle_Shell_Plsql_Sqlplus - Fatal编程技术网

Oracle PL/SQL过程未返回预期结果

Oracle PL/SQL过程未返回预期结果,oracle,shell,plsql,sqlplus,Oracle,Shell,Plsql,Sqlplus,我有一个在shell脚本中运行的PL/SQL过程 我把逻辑拉了出来,但它没有运行内部的起始端;第部分: DECLARE model_exists NUMBER(1); BEGIN SELECT COUNT(*) INTO model_exists from mdsys.rdf_model$ WHERE model_name='XCLOVER'; BEGIN EXECUTE IMMEDIATE 'CREATE table SEMANTIC.RDF_STAGE_TABLE_X

我有一个在shell脚本中运行的PL/SQL过程

我把逻辑拉了出来,但它没有运行内部的起始端;第部分:

DECLARE
model_exists NUMBER(1);
BEGIN 
  SELECT COUNT(*) INTO model_exists from mdsys.rdf_model$ WHERE model_name='XCLOVER';
  BEGIN 
      EXECUTE IMMEDIATE 'CREATE table SEMANTIC.RDF_STAGE_TABLE_XCLOVER(RDF$STC_sub  VARCHAR(4000) not null,RDF$STC_pred VARCHAR(4000) not null,RDF$STC_obj VARCHAR(4000) not null)'; COMMIT;
      EXECUTE IMMEDIATE 'CREATE TABLE SEMANTIC.XCLOVER_TPL (TRIPLE SDO_RDF_TRIPLE_S)'; COMMIT;
      EXCEPTION
      WHEN OTHERS THEN
      IF SQLCODE != -955 THEN
        EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.XCLOVER_TPL';
        EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.RDF_STAGE_TABLE_XCLOVER';
      END IF;
  END; 
EXECUTE IMMEDIATE 'GRANT ALL ON SEMANTIC.XCLOVER_TPL to MDSYS'; 
IF model_exists = 0 THEN
    SEM_APIS.CREATE_SEM_MODEL('XCLOVER', 'XCLOVER_TPL','TRIPLE'); 
END IF;
COMMIT; 
END;
/
在shell脚本中编写的方式如下:

#!/bin/bash
. /etc/profile.d/oracle.sh

MODEL=$1

echo "DECLARE" > createxmodel.tmp
echo "model_exists NUMBER(1);" >> createxmodel.tmp
echo "BEGIN" >> createxmodel.tmp
echo "SELECT COUNT(*) INTO model_exists from mdsys.rdf_model\$ WHERE model_name='$MODEL';" >> createxmodel.tmp
echo "BEGIN" >> createxmodel.tmp
echo "EXECUTE IMMEDIATE 'CREATE table SEMANTIC.RDF_STAGE_TABLE_$MODEL(RDF\$STC_sub  VARCHAR(4000) not null,RDF\$STC_pred VARCHAR(4000) not null,RDF\$STC_obj VARCHAR(4000) not null)';" >> createxmodel.tmp
echo "EXECUTE IMMEDIATE 'CREATE TABLE SEMANTIC.$MODEL""_TPL (TRIPLE SDO_RDF_TRIPLE_S)'; " >> createxmodel.tmp
echo "EXCEPTION" >> createxmodel.tmp
echo "WHEN OTHERS THEN" >> createxmodel.tmp
echo "IF SQLCODE != -955 THEN" >> createxmodel.tmp
echo "EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.$MODEL""_TPL';" >> createxmodel.tmp
echo "EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.RDF_STAGE_TABLE_$MODEL';" >> createxmodel.tmp
echo "END IF;" >> createxmodel.tmp
echo "END;" >> createxmodel.tmp
echo "EXECUTE IMMEDIATE 'GRANT ALL ON SEMANTIC.$MODEL""_TPL to MDSYS';" >> createxmodel.tmp 
echo "IF model_exists = 0 THEN" >> createxmodel.tmp
echo "SEM_APIS.CREATE_SEM_MODEL('$MODEL', '$MODEL""_TPL','TRIPLE');" >> createxmodel.tmp
echo "END IF;" >> createxmodel.tmp
echo "COMMIT;" >> createxmodel.tmp
echo "END;" >> createxmodel.tmp
echo "/" >> createxmodel.tmp
echo "exit;" >> createxmodel.tmp

sqlplus -S user/password < createxmodel.tmp
这告诉我内心的开始永远不会被执行

这一用途适用于:(


有人知道我做错了什么吗?

您所需要做的就是在创建GRANT语句之后移动它——没有理由将它放在块之外——您得到的错误来自编辑器,而不是实际的PL/SQL错误,对吗

    DECLARE
    model_exists NUMBER(1);
    BEGIN 
      SELECT COUNT(*) INTO model_exists from mdsys.rdf_model$ WHERE model_name='XCLOVER';
      BEGIN 
          EXECUTE IMMEDIATE 'CREATE table SEMANTIC.RDF_STAGE_TABLE_XCLOVER(RDF$STC_sub  VARCHAR(4000) not null,RDF$STC_pred VARCHAR(4000) not null,RDF$STC_obj VARCHAR(4000) not null)'; COMMIT;
          EXECUTE IMMEDIATE 'CREATE TABLE SEMANTIC.XCLOVER_TPL (TRIPLE SDO_RDF_TRIPLE_S)'; COMMIT;

EXECUTE IMMEDIATE 'GRANT ALL ON SEMANTIC.XCLOVER_TPL to MDSYS';
          EXCEPTION
          WHEN OTHERS THEN
          IF SQLCODE != -955 THEN
            EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.XCLOVER_TPL';
            EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.RDF_STAGE_TABLE_XCLOVER';
          END IF;
      END; 

    IF model_exists = 0 THEN
        SEM_APIS.CREATE_SEM_MODEL('XCLOVER', 'XCLOVER_TPL','TRIPLE'); 
    END IF;
    COMMIT; 
    END;

我认为最好将每个表的创建放在它自己的开始…结束块中,如:

echo "DECLARE" > createxmodel.tmp
echo "  model_exists NUMBER(1);" >> createxmodel.tmp
echo "  excp_table_exists EXCEPTION;" >> createxmodel.tmp
echo "  PRAGMA EXCEPTION_INIT(excp_table_exists, -955);" >> createxmodel.tmp
echo "BEGIN" >> createxmodel.tmp
echo "  SELECT COUNT(*) INTO model_exists from mdsys.rdf_model\$ WHERE model_name='$MODEL';" >> createxmodel.tmp

echo "  BEGIN" >> createxmodel.tmp
echo "    EXECUTE IMMEDIATE 'CREATE table SEMANTIC.RDF_STAGE_TABLE_$MODEL(RDF\$STC_sub  VARCHAR(4000) not null,RDF\$STC_pred VARCHAR(4000) not null,RDF\$STC_obj VARCHAR(4000) not null)';" >> createxmodel.tmp
echo "  EXCEPTION" >> createxmodel.tmp
echo "    WHEN excp_table_exists THEN" >> createxmodel.tmp
echo "      EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.RDF_STAGE_TABLE_$MODEL';" >> createxmodel.tmp
echo "  END;" >> createxmodel.tmp
echo "  BEGIN" >> createxmodel.tmp
echo "    EXECUTE IMMEDIATE 'CREATE TABLE SEMANTIC.$MODEL""_TPL (TRIPLE SDO_RDF_TRIPLE_S)'; " >> createxmodel.tmp
echo "  EXCEPTION" >> createxmodel.tmp
echo "    WHEN excp_table_exists THEN" >> createxmodel.tmp
echo "      EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.$MODEL""_TPL';" >> createxmodel.tmp
echo "  END;" >> createxmodel.tmp
echo "  EXECUTE IMMEDIATE 'GRANT ALL ON SEMANTIC.$MODEL""_TPL to MDSYS';" >> createxmodel.tmp 
echo "  IF model_exists = 0 THEN" >> createxmodel.tmp
echo "    SEM_APIS.CREATE_SEM_MODEL('$MODEL', '$MODEL""_TPL','TRIPLE');" >> createxmodel.tmp
echo "  END IF;" >> createxmodel.tmp
echo "  COMMIT;" >> createxmodel.tmp
echo "END;" >> createxmodel.tmp
echo "/" >> createxmodel.tmp
echo "exit;" >> createxmodel.tmp
希望这会有所帮助


分享和享受。

这就是为什么正确的异常处理非常重要的一个例子。 如果您至少有一个dbms_输出,可能会节省大量的头数据:

DECLARE
model_exists NUMBER(1);
BEGIN 
  SELECT COUNT(*) INTO model_exists from mdsys.rdf_model$ WHERE model_name='XCLOVER';
  BEGIN 
      EXECUTE IMMEDIATE 'CREATE table SEMANTIC.RDF_STAGE_TABLE_XCLOVER(RDF$STC_sub  VARCHAR(4000) not null,RDF$STC_pred VARCHAR(4000) not null,RDF$STC_obj VARCHAR(4000) not null)'; COMMIT;
      EXECUTE IMMEDIATE 'CREATE TABLE SEMANTIC.XCLOVER_TPL (TRIPLE SDO_RDF_TRIPLE_S)'; COMMIT;
      EXCEPTION
      WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Some error has occurred'):
      IF SQLCODE != -955 THEN
        EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.XCLOVER_TPL';
        EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.RDF_STAGE_TABLE_XCLOVER';
      END IF;
  END; 
EXECUTE IMMEDIATE 'GRANT ALL ON SEMANTIC.XCLOVER_TPL to MDSYS'; 
IF model_exists = 0 THEN
    SEM_APIS.CREATE_SEM_MODEL('XCLOVER', 'XCLOVER_TPL','TRIPLE'); 
END IF;
COMMIT; 
END;
/

您是否确保able或view存在?这就是第一个开始-结束代码块正在执行的操作。它创建两个表,并捕获异常(如果其中任何一个已经存在)。然后,当它获得“授予”选项时,该表应该存在。是否存在
mdsys.rdf_model$
(并且运行脚本的用户帐户可以看到该表)?实际情况是,我有两条CREATE语句,如果其中一条抛出异常,它就不会执行其他CREATE TABLE语句。因此,当它得到授权表时,它不能执行,因为第二条CREATE语句从未执行过。
DECLARE
model_exists NUMBER(1);
BEGIN 
  SELECT COUNT(*) INTO model_exists from mdsys.rdf_model$ WHERE model_name='XCLOVER';
  BEGIN 
      EXECUTE IMMEDIATE 'CREATE table SEMANTIC.RDF_STAGE_TABLE_XCLOVER(RDF$STC_sub  VARCHAR(4000) not null,RDF$STC_pred VARCHAR(4000) not null,RDF$STC_obj VARCHAR(4000) not null)'; COMMIT;
      EXECUTE IMMEDIATE 'CREATE TABLE SEMANTIC.XCLOVER_TPL (TRIPLE SDO_RDF_TRIPLE_S)'; COMMIT;
      EXCEPTION
      WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('Some error has occurred'):
      IF SQLCODE != -955 THEN
        EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.XCLOVER_TPL';
        EXECUTE IMMEDIATE 'TRUNCATE TABLE SEMANTIC.RDF_STAGE_TABLE_XCLOVER';
      END IF;
  END; 
EXECUTE IMMEDIATE 'GRANT ALL ON SEMANTIC.XCLOVER_TPL to MDSYS'; 
IF model_exists = 0 THEN
    SEM_APIS.CREATE_SEM_MODEL('XCLOVER', 'XCLOVER_TPL','TRIPLE'); 
END IF;
COMMIT; 
END;
/