无法选择*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的消息...这与我的headers在php中有关系吗?我把它们包括在哪里?我还需要在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的第一行吗?

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...