微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法选择*ORA-00932:数据类型不一致:预期的CHAR获得了ADT

如何解决无法选择*ORA-00932:数据类型不一致:预期的CHAR获得了ADT

更新更新: 我可以通过定义列名进行查询...因此问题出在 query SELECT *,但是我已经接近 100 表中的列..我不想对所有列进行硬核化并维护该列表..为什么我不能使用SELECT *


我只是想创建一个按钮;用户可以在前端中选择三个表之一来导出为.csv文件。单击选项->通过table:which;将选项传递回我的PHP,然后将在oracle数据库查询特定表并在浏览器中下载。下面是我尝试返回错误的尝试。


jQuery前端调用(单击导出按钮):

$('#export' + '.' + crnt).click(function(){
      let which = crnt;
      window.location.href = "export?table="+which;
});

通过细长路径的PHP

<?PHP
    
$app->post('/export',function ($request,$response,$args) {    

    $which = $_POST['table'];
    
    $config = parse_ini_file(__DIR__ . '/../../xx/xx.ini');
    $dbuser = $config['dbuser'];
    $dbpass = $config['dbpass'];
    $dbhost = $config['dbhost'];
    $dbname = $config['dbname'];
    $constr = $dbhost.'/'.$dbname;
    $conn = oci_pconnect($dbuser,$dbpass,$constr,'XXX');

    if ($which == 'table_1'){
        $sql = 'SELECT * FROM app.table_1';
        $columnsql = 'SELECT column_name FROM app.table_1';
    } else if ($which == 'table_2'){
        $sql = 'SELECT * FROM app.table_2';
        $columnsql = 'SELECT column_name FROM app.table_2';
    } else if ($which == 'table_3'){
        $sql = 'SELECT * FROM app.table_3';
        $columnsql = 'SELECT column_name FROM app.table_3';
    }

    $stmt = oci_parse($conn,$sql); 
    $columnstmt = oci_parse($conn,$columnsql); 
    oci_execute($stmt);
    oci_execute($columnstmt);

    $columnnames = oci_fetch_array($columnstmt,OCI_ASSOC);
    $output = fopen("PHP://output","w");
    fputcsv($output,$columnnames);

    while ($row = oci_fetch_array($stmt,OCI_ASSOC)) {
        fputcsv($output,$row);
    }

    fclose($output);

    header("Content-Type: text/csv; charset=utf-8");
    header("Content-disposition: attachment; filename=$which.csv");
    
    if (!@oci_execute($stmt)) {
       $error = oci_error($stmt);
       throw new Exception($error['message']);
    }

    if (!@oci_execute($columnstmt)) {
       $error = oci_error($columnstmt);
       throw new Exception($error['message']);
    }

});

错误500:以上内容在我的开发工具网络控制台->预览响应标签中返回以下错误

enter image description here

enter image description here


更新

我现在已将所有post实例更新为-> get,该实例修复了不允许 post方法的消息,但仍在接收ORA inconsistent datatypes error的消息...这与我的headersPHP中有关系吗?我把它们包括在哪里?我还需要在ajax调用中指定数据类型吗?如何处理潜在的*ADT*数据类型?

解决方法

对提取列的请求很奇怪。不是这样吗?

select column_name from all_tab_columns where table_name = 'table_1';

您使用OCI_ASSOC。您可以使用类似的功能保存请求

while ($row = oci_fetch_array($stmt,OCI_ASSOC)) {
        write_head_column($output,$row);
        fputcsv($output,$row);
}

function write_head_column(&$output,$row){
  static $is_done;
  if(empty($is_done)){
    $head = key($row);
    fputcsv($output,$head);
    $is_done = true;
  }
}
,

看起来您的一个或多个列是对象,例如SDO_GEOMETRY,并且无法通过*选择这种列 您应该使用类似的

SELECT c.shape.Get_Dims()
FROM cola_markets c WHERE c.name = 'cola_b';

@请参阅https://docs.oracle.com/database/121/SPATL/sdo_geometry-methods.htm#SPATL498

,

您可以通过获取列名并将它们全部转换为所创建查询中的文本字符串来动态创建查询(甚至可以将文本转换为文本)。 https://docs.microsoft.com/en-us/sql/t-sql/spatial-geometry/tostring-geometry-data-type?view=sql-server-ver15

您要将列名放在CSV的第一行吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。